Определение глобальных переменных в .h файлах
От: AlexGluharev  
Дата: 30.09.04 17:22
Оценка:
Пожалуйста, помогите!

Пишу программу на Visual C++. В пректе находится несколько .cpp файлов, в каждый из которых
я вставляю заголовочный файл с глобальными переменными (естественно, в те .cpp файлы, в которых
эти переменные используются) с помощью #include "global.h"

Так вот, при компиляции никаких ошибок не возникает, а при линковке выдаётся сообщение типа:
error LNK2005: "..тут имя переменной.. already defined in File.obj
и линковка останавливается.

Как я понимаю это означает, что такая-то переменная уже определена в одном из .obj файлов.
Что делать не знаю !?

Вот, например файл "windows.h" и другие системные файлы (в < таких > кавычках) можно включать во все .cpp файлы и в любом колличестве. А нельзя ли также подключать и свои ??

Пожалуйста, посоветуйте, что делать, а то в одном .cpp файле весь код не уместишь !!!
Пишу на чистом API, но если посоветуете, как это осуществить на MFC, тоже буду рад (хотя меньше).
Re: Определение глобальных переменных в .h файлах
От: Олег Гашев
Дата: 30.09.04 17:29
Оценка:
Здравствуйте, AlexGluharev, Вы писали:

AG>Вот, например файл "windows.h" и другие системные файлы (в < таких > кавычках) можно включать во все .cpp файлы и в любом колличестве. А нельзя ли также подключать и свои ??


Пропиши во все свои заголовочные файлы


#ifndef <FileName>
#define <FileName>

// Тут твои заголовки

#endif
Либо я найду путь, либо проложу его. © Свифт
Re: Определение глобальных переменных в .h файлах
От: _Winnie Россия C++.freerun
Дата: 30.09.04 20:30
Оценка:
Здравствуйте, AlexGluharev, Вы писали:

AG>error LNK2005: "..тут имя переменной.. already defined in File.obj

AG>Как я понимаю это означает, что такая-то переменная уже определена в одном из .obj файлов.


AG>Определение глобальных переменных в .h файлах


Да-да, их там нельзя определять. Только объявлять. Определять нужно в .cpp файлах. А .h включаеются во много .cpp файлов сразу и получаем already defined in File.obj

файл x.h:
extern int xxx; //объвляем

файл x.cpp:
int xxx; //определяем

в остальных файлах —

#include "x.h"
Правильно работающая программа — просто частный случай Undefined Behavior
Re: Определение глобальных переменных в .h файлах
От: 0xDEADBEEF Ниоткуда  
Дата: 30.09.04 22:03
Оценка:
Здравствуйте, AlexGluharev, Вы писали:

AG>Пожалуйста, помогите!


AG>Пишу программу на Visual C++. В пректе находится несколько .cpp файлов, в каждый из которых

AG>я вставляю заголовочный файл с глобальными переменными (естественно, в те .cpp файлы, в которых
AG>эти переменные используются) с помощью #include "global.h"
то есть типа
TheClass g_variable;


Если так, то ты в пролете — эта штука будет включена в КАЖДЫЙ .cpp файл, где ты используешь (прямо или косвенно) твой "global.h". А это, в свою очередь, значит, что при линковке у тебя будет g_variable в каждом .obj — файле.
Линкер на такое должен обижаться.

Теперь, как этого избежать:
— или используй директиву "selectany" вот так:
__declspec(selectany) TheClass g_variable;

— или перенеси декларации "TheClass g_variаble;" в какой-нибудь (но ОДИН!) .cpp-файл, а вместо этого в .h-файле используй "extern TheClass g_variable;"
__________
16.There is no cause so right that one cannot find a fool following it.
Re[2]: Определение глобальных переменных в .h файлах
От: Chez Россия  
Дата: 01.10.04 13:11
Оценка:
Здравствуйте, 0xDEADBEEF, Вы писали:

DEA>Здравствуйте, AlexGluharev, Вы писали:


AG>>Пожалуйста, помогите!


AG>>Пишу программу на Visual C++. В пректе находится несколько .cpp файлов, в каждый из которых

AG>>я вставляю заголовочный файл с глобальными переменными (естественно, в те .cpp файлы, в которых
AG>>эти переменные используются) с помощью #include "global.h"
DEA>то есть типа
DEA>
DEA>TheClass g_variable;
DEA>


DEA>Если так, то ты в пролете — эта штука будет включена в КАЖДЫЙ .cpp файл, где ты используешь (прямо или косвенно) твой "global.h". А это, в свою очередь, значит, что при линковке у тебя будет g_variable в каждом .obj — файле.

DEA>Линкер на такое должен обижаться.

DEA>Теперь, как этого избежать:

DEA>- или используй директиву "selectany" вот так:
__declspec(selectany) TheClass g_variable;

DEA>- или перенеси декларации "TheClass g_variаble;" в какой-нибудь (но ОДИН!) .cpp-файл, а вместо этого в .h-файле используй "extern TheClass g_variable;"

Selectany работает только так:
extern __declspec(selectany) type_without_constructor = initializer;


иначе:

error C2496: 'sss' : 'selectany' can only be applied to statically initialized data items with external linkage

Chez, ICQ# 161095094
Re[2]: Определение глобальных переменных в .h файлах
От: AlexGluharev  
Дата: 01.10.04 16:01
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Здравствуйте, AlexGluharev, Вы писали:


AG>>error LNK2005: "..тут имя переменной.. already defined in File.obj

AG>>Как я понимаю это означает, что такая-то переменная уже определена в одном из .obj файлов.


AG>>Определение глобальных переменных в .h файлах


_W>Да-да, их там нельзя определять. Только объявлять. Определять нужно в .cpp файлах. А .h включаеются во много .cpp файлов сразу и получаем already defined in File.obj


_W>файл x.h:

_W>extern int xxx; //объвляем

_W>файл x.cpp:

_W>int xxx; //определяем

_W>в остальных файлах —


_W>#include "x.h"


Большое спасибо, всё заработало!
Очень благодарен, а то давно мучаюсь.
Re: Определение глобальных переменных в .h файлах
От: pvoid28 Россия  
Дата: 12.10.04 13:25
Оценка:
Здравствуйте, AlexGluharev, Вы писали:
AG>эти переменные используются) с помощью #include "global.h"
глобальные переменные рассмотриваются как зло, но если они являются
частью интерфейса модуля — это явно Ваш случай, их надо обязательно
объявлять в инклюде.

Пример инклюда:
extern int g_foo;
Пример Foo.cpp:
int g_foo = 0;
... << RSDN@Home 1.1.3 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.