Глобальные переменные |
Здравствуйте, гость ( Вход | Регистрация )
Глобальные переменные |
Raks123 |
22.11.2011, 16:05
Сообщение
#1
|
Студент Группа: Новичок Сообщений: 16 Регистрация: 2.10.2011 Пользователь №: 2920 Спасибо сказали: 0 раз(а) Репутация: 0 |
Вопрос такой: как правильно создать глобальную переменную, чтобы её было видно в разных cpp файлах? Знаю, что это плохая практика, но все-таки у меня по другому, даже через самую большую задницу, которую я пытался изобрести не получается(((
|
|
|
PAFOS |
22.11.2011, 16:26
Сообщение
#2
|
Активный участник Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: 8 |
на такие случаи я обычно делаю один класс, в который пихаю статические переменные. - Удобно и красиво)
|
|
|
ilyabvt |
22.11.2011, 17:38
Сообщение
#3
|
Активный участник Группа: Участник Сообщений: 297 Регистрация: 23.6.2011 Пользователь №: 2765 Спасибо сказали: 45 раз(а) Репутация: 3 |
Используйте ключевое слово extern, прочитать можно например здесь:
http://www.rsdn.ru/forum/cpp/2706624.1.aspx Но если таких переменных куча, то лучше использовать способ от PAFOS. |
|
|
Алексей1153 |
23.11.2011, 7:36
Сообщение
#4
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
с классом всегда удобнее
extern - это хвостик от C остался Сообщение отредактировал Алексей1153 - 23.11.2011, 7:36 |
|
|
Raks123 |
25.11.2011, 19:56
Сообщение
#5
|
Студент Группа: Новичок Сообщений: 16 Регистрация: 2.10.2011 Пользователь №: 2920 Спасибо сказали: 0 раз(а) Репутация: 0 |
Навыдавало кучу ошибок, подскажите что не так:
Вот у меня есть global.h
Тут собралось нормально, но когда я заполняю перемнную kolichestvo и вектор vector в файле openbase.cpp вот так:
то выводит следующее - release/openbase.o:openbase.cpp:(.text+0x60): undefined reference to `Global::vector' release/openbase.o:openbase.cpp:(.text+0xc3): undefined reference to `Global::vector' release/openbase.o:openbase.cpp:(.text+0xdc): undefined reference to `Global::vector' release/openbase.o:openbase.cpp:(.text+0x192): undefined reference to `Global::vector' release/openbase.o:openbase.cpp:(.text+0x1a6): undefined reference to `Global::vector' release/openbase.o:openbase.cpp:(.text+0x1cd): more undefined references to `Global::vector' follow release/openbase.o:openbase.cpp:(.text+0x67b): undefined reference to `Global::kolichestvo' release/openbase.o:openbase.cpp:(.text+0x6b2): undefined reference to `Global::kolichestvo' release/openbase.o:openbase.cpp:(.text+0x6b7): undefined reference to `Global::vector' release/openbase.o:openbase.cpp:(.text+0x6cc): undefined reference to `Global::vector' release/openbase.o:openbase.cpp:(.text+0x75d): undefined reference to `Global::kolichestvo' release/openbase.o:openbase.cpp:(.text+0x762): undefined reference to `Global::vector' release/openbase.o:openbase.cpp:(.text+0x777): undefined reference to `Global::vector' release/openbase.o:openbase.cpp:(.text+0x858): undefined reference to `Global::kolichestvo' release/openbase.o:openbase.cpp:(.text+0x85d): undefined reference to `Global::vector' release/openbase.o:openbase.cpp:(.text+0x881): undefined reference to `Global::vector' release/openbase.o:openbase.cpp:(.text+0x8bb): undefined reference to `Global::kolichestvo' release/openbase.o:openbase.cpp:(.text+0x8c0): undefined reference to `Global::vector' release/openbase.o:openbase.cpp:(.text+0x8dc): undefined reference to `Global::vector' release/openbase.o:openbase.cpp:(.text+0x8e6): undefined reference to `Global::kolichestvo' release/openbase.o:openbase.cpp:(.text+0x900): undefined reference to `Global::kolichestvo' release/openbase.o:openbase.cpp:(.text+0x906): undefined reference to `Global::vector' release/openbase.o:openbase.cpp:(.text+0x9b4): undefined reference to `Global::kolichestvo' release/openbase.o:openbase.cpp:(.text+0x9b9): undefined reference to `Global::vector' release/openbase.o:openbase.cpp:(.text+0x9dd): undefined reference to `Global::vector' release/openbase.o:openbase.cpp:(.text+0xa7a): undefined reference to `Global::kolichestvo' collect2: ld returned 1 exit status mingw32-make[1]: *** [release\probnick.exe] Error 1 mingw32-make: *** [release] Error 2 |
|
|
sidsukana |
25.11.2011, 20:10
Сообщение
#6
|
Участник Группа: Участник Сообщений: 158 Регистрация: 23.12.2010 Из: Челябинск Пользователь №: 2296 Спасибо сказали: 10 раз(а) Репутация: 2 |
Первое определение вне объекта сделай. Чтото типа дефолтных значений.
Хотя если добавишь перед переменными тип, то может и так прокатит.) PS имена переменных умиляют На первых страницах любого пособия по программированию первым делом предупреждают об использовании таких имен Сообщение отредактировал sidsukana - 25.11.2011, 20:12 |
|
|
BlueIceScream |
25.11.2011, 21:27
Сообщение
#7
|
Студент Группа: Участник Сообщений: 56 Регистрация: 21.11.2011 Из: Республика Дагестан Пользователь №: 3016 Спасибо сказали: 18 раз(а) Репутация: 3 |
Статические члены класса создаются не при их объявлении, а при обязательном определении. Прежде чем писать код, надо уметь его писать. Срочно перечитывать книгу Срауструпа. int Global::kolichestvo = <default value> - создаст статический член класса. Остальное подскажет книга. |
|
|
Iron Bug |
25.11.2011, 21:55
Сообщение
#8
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
с классом всегда удобнее extern - это хвостик от C остался не всегда. особенно при кроссплатформе и разных компиляторах. не все компиляторы понимают объявления без extern. это зависит от платформы и конкретного компилятора. extern поддерживают абсолютно все. это стандарт. а вот экспорт классов в библиотеках разных компиляторов сделан по-разному. и часто для совместимости библиотек приходится писать обёртки и вызов отдельных функций именно через функции и extern, потому что это стандартный метод. а экспорт классов не стандартизован и каждый создатель компилятора делает, как может. а у мелкософта ещё и от версии к версии эти форматы менялись и в результате классы в библиотеках, собранных старыми студиями не совместимы с вызовами в новых конечно, если это одна платформа, один компилятор и один программист - то решительно пофиг. но если вдруг собираешься экспортировать свои библиотеки (особенно закрытый код), то лучше избегать экспорта классов и глобальных данных. потому что с ними можно огрести геморроя при некоторых обстоятельствах. |
|
|
Текстовая версия | Сейчас: 25.11.2024, 19:49 |