Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> настройки проекта. Не могу объявить переменные, Visual Studio 2003 
:(
    Опции темы
ProgMaster
  Дата 24.11.2007, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 24.1.2006
Где: Estonia

Репутация: нет
Всего: нет



Вообщем хрень какая-то. Редактирую сурсы кое-какие. Пытаюсь, что в новом хедере, что в существующем объявить какие-либо переменные. В итоге получаю :
Код

Project1 fatal error LNK1169: one or more multiply defined symbols found
Project1 error LNK2005: "char * fuckyou" (?fuckyou@@3PADA) already defined in Project.obj
Project1 error LNK2005: "char * fuckyou" (?fuckyou@@3PADA) already defined in Project.obj
Project1 error LNK2005: "char * fuckyou" (?fuckyou@@3PADA) already defined in Project.obj

Я пробывал и удалять файлы (obj) и делать Rebuild. Ничего не помогает. Кое-что пробывал менять в настройках проекта - но тоже нулевой эффект. Что нужно сделать, чтобы нормально можно было работать ??? (если объявлять тоже самое в cpp файлах - проблем нет).
PM MAIL ICQ   Вверх
Fazil6
Дата 24.11.2007, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(ProgMaster @  24.11.2007,  22:16 Найти цитируемый пост)
Я пробывал и удалять файлы (obj) и делать Rebuild. Ничего не помогает.

серьезно?

Цитата(ProgMaster @  24.11.2007,  22:16 Найти цитируемый пост)
 Что нужно сделать, чтобы нормально можно было работать ???

ничего. Просто не определять переменные в хедерах. Хедеры не для этого. Ну еще язык используемый подучить немного, в части для чего ключевое слово extern существует
PM MAIL   Вверх
Любитель
Дата 24.11.2007, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Может хейдер-гуарды не стоят? Очень похоже.


--------------------
PM MAIL ICQ Skype   Вверх
bsa
Дата 24.11.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Любитель @ 24.11.2007,  22:42)
Может хейдер-гуарды не стоят? Очень похоже.

Нет. Судя по всему, у него ругается линкер - а это значит, что в разных единицах компиляции встречаются одинаковые символы. Проще говоря, нельзя объявлять глобальные переменные в *.h файлах. Можно только декларировать через extern.
PM   Вверх
Любитель
Дата 25.11.2007, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Туплю... :(


--------------------
PM MAIL ICQ Skype   Вверх
ProgMaster
Дата 25.11.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 24.1.2006
Где: Estonia

Репутация: нет
Всего: нет



Цитата(Fazil6 @  24.11.2007,  22:40 Найти цитируемый пост)
серьезно?

Не млин...я прикалываюсь...
Цитата(Fazil6 @  24.11.2007,  22:40 Найти цитируемый пост)
ничего. Просто не определять переменные в хедерах. Хедеры не для этого. Ну еще язык используемый подучить немного, в части для чего ключевое слово extern существует 

Да...дельный совет. А собственно для чего они ?? хедеры ??? И я прекрасно знаю для чего существует extern. 

Цитата(bsa @  24.11.2007,  23:09 Найти цитируемый пост)
Нет. Судя по всему, у него ругается линкер - а это значит, что в разных единицах компиляции встречаются одинаковые символы. Проще говоря, нельзя объявлять глобальные переменные в *.h файлах. Можно только декларировать через extern.

Это с каких пор нельзя объявлять в хидерах глоб переменные ?? А классы и namespace вы где объявляете ??  Всю жизнь так делали и будут делать. 

Всем спс, разберусь. 
PM MAIL ICQ   Вверх
Любитель
Дата 25.11.2007, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(ProgMaster @  25.11.2007,  14:58 Найти цитируемый пост)
классы и namespace

!=
Цитата(ProgMaster @  25.11.2007,  14:58 Найти цитируемый пост)
глоб переменные


Цитата(bsa @  24.11.2007,  23:09 Найти цитируемый пост)
 Проще говоря, нельзя объявлять глобальные переменные в *.h файлах. Можно только декларировать через extern.




--------------------
PM MAIL ICQ Skype   Вверх
ProgMaster
Дата 25.11.2007, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 24.1.2006
Где: Estonia

Репутация: нет
Всего: нет



Но тема в том, что я пробывал и просто так объявлять, и как namespace...Одна и та же штука получается...
PM MAIL ICQ   Вверх
Alek86
Дата 25.11.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(bsa @  24.11.2007,  23:09 Найти цитируемый пост)
нельзя объявлять глобальные переменные в *.h файлах


ты поясни, в каком имено смысле "нельзя"
.h - это просто кусок кода, который подставляется в cpp. Так что еще как можно. Только не нужно, если этот ашник в 2 сипипишника инклудится

Добавлено через 48 секунд
Цитата(ProgMaster @  25.11.2007,  16:08 Найти цитируемый пост)
Но тема в том, что я пробывал и просто так объявлять, и как namespace...

код можно увидеть?
ато ниасилил, как ты переменную объявляешь как неймспейс smile

Добавлено через 1 минуту и 51 секунду
кстати вопрос о терминологии
"объявить" и "определить" переменную - это одно и то же?
в случае функций это разные вещи....


--------------------
user posted image    user posted image
PM MAIL   Вверх
Любитель
Дата 25.11.2007, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(Alek86 @  25.11.2007,  16:11 Найти цитируемый пост)
в случае функций это разные вещи....

extern - и есть, грубо говоря, declaration для переменной.


--------------------
PM MAIL ICQ Skype   Вверх
bsa
Дата 25.11.2007, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Alek86 @ 25.11.2007,  16:11)
Цитата(bsa @  24.11.2007,  23:09 Найти цитируемый пост)
нельзя объявлять глобальные переменные в *.h файлах


ты поясни, в каком имено смысле "нельзя"
.h - это просто кусок кода, который подставляется в cpp. Так что еще как можно. Только не нужно, если этот ашник в 2 сипипишника инклудится

Я это говорил для человека, который не сильно понимает, что происходит. Если бы я еще в такие дебри стал забираться, то он бы еще меньше бы понял.

Добавлено через 8 минут и 41 секунду
ProgMaster, короче. есть понятие "объявления" и "определения". Объявлять ты можешь что угодно в скольки угодно модулях. А определять нестатические вещи только в одном месте. Другими словами:
myprocs.h:
Код
...
extern int my_var; //это объявление
...
myprocs.c:
Код
#include "myprocs.h"
...
int my_var; //а это определение
...
И если ты такой заголовочный файл подключишь в более, чем одном *.c файле, то все my_var будут ссылаться на одну переменную, определенную в myprocs.c.
Если ты уберешь extern из *.h файла и подключишь в нескольких файлах проекта myprocs.h, то во всех модулях появится своя переменная my_var, которая на этапе компоновки введет линкер в недоумение, на что он отреагирует указанными тобой сообщениями.

Как вариант, можно extern заменить на static. Тогда в каждом модуле будет своя переменная my_var, но линкер уже ругаться не будет.
PM   Вверх
Alek86
Дата 25.11.2007, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



bsa, спасибо за объяснение smile

Добавлено через 6 минут и 16 секунд
и еще вопрос smile
Код

int my_var;
int my_var2 = 0;


для С++ есть разница? в С int my_var2 = 0, вроде, вообще писать нельзя было....


--------------------
user posted image    user posted image
PM MAIL   Вверх
bsa
Дата 25.11.2007, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Можно. Может, конечно, в какой-то древней версии и нельзя было, но в текущей можно.
А вот насчет разницы не помню. Лично я всегда инициализирую перед использованием.
PM   Вверх
ProgMaster
Дата 25.11.2007, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 24.1.2006
Где: Estonia

Репутация: нет
Всего: нет



Цитата(Alek86 @  25.11.2007,  16:11 Найти цитируемый пост)
.h - это просто кусок кода, который подставляется в cpp. Так что еще как можно. Только не нужно, если этот ашник в 2 сипипишника инклудится

В этом вся тема, что этот хедер - конфиг, и подключается ко всему и вся (почти).
Цитата(Alek86 @  25.11.2007,  16:11 Найти цитируемый пост)
код можно увидеть?
ато ниасилил, как ты переменную объявляешь как неймспейс 

Внутри неймспейса, а не как.
Цитата(bsa @  25.11.2007,  17:02 Найти цитируемый пост)
Я это говорил для человека, который не сильно понимает, что происходит. Если бы я еще в такие дебри стал забираться, то он бы еще меньше бы понял.

Откуда такие выводы smile ?
Цитата(bsa @  25.11.2007,  17:02 Найти цитируемый пост)
ProgMaster, короче. есть понятие "объявления" и "определения". Объявлять ты можешь что угодно в скольки угодно модулях. А определять нестатические вещи только в одном месте. Другими словами:

Определить - это определить. А объявить - это объявить. Может я конечно запарился со словами, но определение - это с присвоением значения; объявить - без.

Я же говорю, всю жизнь объявлял переменные в хидерах - и никаких проблем не было. Соберите вы пустой проект и засуньте в хидер "char szbuf[MAX_PATH]" и никто ничего не скажет. Короче бред какой-то.
PM MAIL ICQ   Вверх
Alek86
Дата 25.11.2007, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(ProgMaster @  25.11.2007,  18:08 Найти цитируемый пост)
Может я конечно запарился со словами, но определение - это с присвоением значения; объявить - без.

получается, что ты не прав


Цитата(ProgMaster @  25.11.2007,  18:08 Найти цитируемый пост)
всю жизнь

ощущение (по манере разговора), что жизни той не очень уж и много.
Ты, наверное, раньше никогда не вставлял этот ашник в 2 разных сипипишника. И читать не хочешь, что тебе пишут.

для примера попробуй сделай так:
(header.h)
Код
int i;

(obj1.cpp)
Код
#include "header.h"

(obj2.cpp)
Код
#include "header.h"


и скомпиль
(если у тя нужны прекомпилед хедерс, добавь)

Это сообщение отредактировал(а) Alek86 - 25.11.2007, 18:46


--------------------
user posted image    user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0587 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.