![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| ProgMaster |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 24.1.2006 Где: Estonia Репутация: нет Всего: нет |
Вообщем хрень какая-то. Редактирую сурсы кое-какие. Пытаюсь, что в новом хедере, что в существующем объявить какие-либо переменные. В итоге получаю :
Я пробывал и удалять файлы (obj) и делать Rebuild. Ничего не помогает. Кое-что пробывал менять в настройках проекта - но тоже нулевой эффект. Что нужно сделать, чтобы нормально можно было работать ??? (если объявлять тоже самое в cpp файлах - проблем нет). |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Может хейдер-гуарды не стоят? Очень похоже.
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Нет. Судя по всему, у него ругается линкер - а это значит, что в разных единицах компиляции встречаются одинаковые символы. Проще говоря, нельзя объявлять глобальные переменные в *.h файлах. Можно только декларировать через extern. |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Туплю... :(
|
|||
|
||||
| ProgMaster |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 24.1.2006 Где: Estonia Репутация: нет Всего: нет |
Не млин...я прикалываюсь...
Да...дельный совет. А собственно для чего они ?? хедеры ??? И я прекрасно знаю для чего существует extern. Это с каких пор нельзя объявлять в хидерах глоб переменные ?? А классы и namespace вы где объявляете ?? Всю жизнь так делали и будут делать. Всем спс, разберусь. |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
||||
|
||||
| ProgMaster |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 24.1.2006 Где: Estonia Репутация: нет Всего: нет |
Но тема в том, что я пробывал и просто так объявлять, и как namespace...Одна и та же штука получается...
|
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
ты поясни, в каком имено смысле "нельзя" .h - это просто кусок кода, который подставляется в cpp. Так что еще как можно. Только не нужно, если этот ашник в 2 сипипишника инклудится Добавлено через 48 секунд
код можно увидеть? ато ниасилил, как ты переменную объявляешь как неймспейс Добавлено через 1 минуту и 51 секунду кстати вопрос о терминологии "объявить" и "определить" переменную - это одно и то же? в случае функций это разные вещи.... |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
extern - и есть, грубо говоря, declaration для переменной. |
|||
|
||||
| bsa |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Я это говорил для человека, который не сильно понимает, что происходит. Если бы я еще в такие дебри стал забираться, то он бы еще меньше бы понял. Добавлено через 8 минут и 41 секунду ProgMaster, короче. есть понятие "объявления" и "определения". Объявлять ты можешь что угодно в скольки угодно модулях. А определять нестатические вещи только в одном месте. Другими словами: myprocs.h:
Если ты уберешь extern из *.h файла и подключишь в нескольких файлах проекта myprocs.h, то во всех модулях появится своя переменная my_var, которая на этапе компоновки введет линкер в недоумение, на что он отреагирует указанными тобой сообщениями. Как вариант, можно extern заменить на static. Тогда в каждом модуле будет своя переменная my_var, но линкер уже ругаться не будет. |
||||||
|
|||||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
bsa, спасибо за объяснение
Добавлено через 6 минут и 16 секунд и еще вопрос
для С++ есть разница? в С int my_var2 = 0, вроде, вообще писать нельзя было.... |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Можно. Может, конечно, в какой-то древней версии и нельзя было, но в текущей можно.
А вот насчет разницы не помню. Лично я всегда инициализирую перед использованием. |
|||
|
||||
| ProgMaster |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 24.1.2006 Где: Estonia Репутация: нет Всего: нет |
В этом вся тема, что этот хедер - конфиг, и подключается ко всему и вся (почти).
Внутри неймспейса, а не как.
Откуда такие выводы Определить - это определить. А объявить - это объявить. Может я конечно запарился со словами, но определение - это с присвоением значения; объявить - без. Я же говорю, всю жизнь объявлял переменные в хидерах - и никаких проблем не было. Соберите вы пустой проект и засуньте в хидер "char szbuf[MAX_PATH]" и никто ничего не скажет. Короче бред какой-то. |
||||||
|
|||||||
| Alek86 |
|
||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
получается, что ты не прав ощущение (по манере разговора), что жизни той не очень уж и много. Ты, наверное, раньше никогда не вставлял этот ашник в 2 разных сипипишника. И читать не хочешь, что тебе пишут. для примера попробуй сделай так: (header.h)
(obj1.cpp)
(obj2.cpp)
и скомпиль (если у тя нужны прекомпилед хедерс, добавь) Это сообщение отредактировал(а) Alek86 - 25.11.2007, 18:46 |
||||||||
|
|||||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |