![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Такой вопрос: есть, к примеру, файлы first.cpp, first.h, second.cpp, second.h.
Из них собираются объектные файлы соответственно first.o и second.o, которые после слинковываются в одну библиотеку. В second.h объявлена переменная, которая используется как в first.cpp, так и в second.cpp. Соответственно, second.h включен и в first.cpp, и в second.cpp. При линковке компилятор ругается на то, что в обоих *.o файлах объявление этой переменной дублируется. Правильно ли будет задать ей модификатор static, или есть "более другие" методы решения этой проблемы? |
|||
|
||||
| MAKCim |
|
||||||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
EnergoHokum,
в second.h переменная должна быть объявлена с модификатором extern а определена в одном из .cpp-файлов
неправильно, если переменная должна быть глобальной для всех модулей если ее определить как static, то в каждом модуле будет свой локальный экземпляр переменной
Это сообщение отредактировал(а) MAKCim - 6.12.2007, 10:12 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||||||
|
|||||||||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Хм, когда переопределил с extern, пошла ругань вида: ...undefined reference to.... Эту переменную нужно инициализировать в соответствующем *.cpp, или всё равно где?
Это сообщение отредактировал(а) EnergoHokum - 6.12.2007, 10:15 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
EnergoHokum,
я же пример написал специально
все равно, главное должно быть где-то определение (но не в .h-файле естественно) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| EnergoHokum |
|
||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
В общем, упрощённо ситуация такая:
Действительно, при объявлении переменных со static для каждого .o-файла они получаются свои, но и с extern тоже ничего хорошего не выходит. |
||||||||||
|
|||||||||||
| t_gran |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 621 Регистрация: 13.11.2007 Где: г.Усть-Илимск Репутация: 1 Всего: 37 |
Предлагаю так:
-------------------- Я знаю, что ничего не знаю© Сократ ![]() |
|||
|
||||
| MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Мне нужно, чтобы переменные оставались там, где они лежат сейчас, по контексту они так привязаны. Можно (наверное) вообще сгрести их все в один .h-файл, но это не решение. Это здесь два объектника, а в проекте их больше. Перетряхивать всю структуру проекта? Это практически невозможно.
Это сообщение отредактировал(а) EnergoHokum - 6.12.2007, 10:53 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
ну что значит привязаны? разве сейчас что-то изменилось? абсолютно ничего, просто определение переменных я вынес в отдельный .cpp-файл чтобы не было нарушения правила одного определения при подключении .h-файла в разные .cpp-файлы по-другому здесь не сделаешь в .h-файле не должно быть не static-определений Это сообщение отредактировал(а) MAKCim - 6.12.2007, 10:56 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
MAKCim, а зачем
и оффтопный вопрос. где-то слышал, что static (не в функциях) делать не рекомендуется. почему, не подскажешь? |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
имхо, так наглядней
если речь о С++, то там есть анонимные пространства имен, которые заменяют static -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Ви будете смеяться, но таки ничего не изменилось! Или это я уже туплю?
Да, действительно, туплю. Но всё равно как-то неизящно выходит. Счас поковыряюсь ещё, может, что и придумается... Это сообщение отредактировал(а) EnergoHokum - 6.12.2007, 11:08 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
global.cpp создал? поместил туда определение символов? добавил в Makefile global.cpp и global.o -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
||||
|
||||
| Random13 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 116 Регистрация: 21.11.2007 Репутация: нет Всего: нет |
А разве статик не должны быть тоже определены в срр файле ? В h файле только, вроде, объявление идет, а память должна выделятся в срр ? Как я понимаю, в одном файле h глобальная переменная должна быть объявлена без extern, этот файл должен быть подключен к срр, где ей отводится память, в остальных h файлах должно стоять extern. Разве только для static - extern бесполезно делать ее видимость все равно ограничивается файлом. Это сообщение отредактировал(а) Random13 - 6.12.2007, 11:34 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |