Как объявить глобальную переменную в C++

Я знаю, что не следует использовать глобальные переменные, но мне они нужны. Я читал, что любая переменная, объявленная вне функции, является глобальной переменной. Я сделал это, но в другом файле *.cpp эту переменную не удалось найти. Так что это было не совсем глобально. Разве не нужно создавать заголовочный файл GlobalVariabels.h и включать этот файл в любой другой *cpp-файл, который его использует?

3 ответа

Я читал, что любая переменная, объявленная вне функции, является глобальной переменной. Я сделал это, но в другом файле *.cpp эту переменную не удалось найти. Так что это было не совсем глобально.

Согласно концепции области видимости, ваша переменная является глобальной. Однако то, что вы прочитали / поняли, слишком упрощено.


Возможность 1

Возможно, вы забыли объявить переменную в другом модуле перевода (TU). Вот пример:

a.cpp

int x = 5; // declaration and definition of my global variable

b.cpp

// I want to use `x` here, too.
// But I need b.cpp to know that it exists, first:
extern int x; // declaration (not definition)

void foo() {
   cout << x;  // OK
}

Как правило, вы бы разместить extern int x; в заголовочном файле, который включается в b.cpp, а также в любой другой TU, который в конечном итоге нуждается в использовании x,


Возможность 2

Кроме того, возможно, что переменная имеет внутреннюю связь, что означает, что она не отображается между единицами перевода. Это будет иметь место по умолчанию, если переменная помечена const ([C++11: 3.5/3]):

a.cpp

const int x = 5; // file-`static` by default, because `const`

b.cpp

extern const int x;    // says there's a `x` that we can use somewhere...

void foo() {
   cout << x;    // ... but actually there isn't. So, linker error.
}

Вы можете исправить это, подав заявку extern к определению тоже:

a.cpp

extern const int x = 5;

Вся эта малярность примерно эквивалентна той неразберихе, которую вы проходите, делая функции видимыми / пригодными для использования через границы TU, но с некоторыми различиями в том, как вы это делаете.

Вы объявляете переменную как extern в общем заголовке:

//globals.h
extern int x;

И определите это в файле реализации.

//globals.cpp
int x = 1337;

Затем вы можете включить заголовок везде, где вам нужен доступ к нему.

Я предлагаю вам также обернуть переменную внутри namespace,

В дополнение к другим ответам здесь, если значение является интегральной константой, будет работать общедоступное перечисление в классе или структуре. Переменная - константа или иное - в корне пространства имен - это другая опция, или статический открытый член класса или структуры - третья опция.

MyClass::eSomeConst (enum)
MyNamespace::nSomeValue 
MyStruct::nSomeValue (static) 

Не уверен, что это правильно в каком-то смысле, но мне кажется, что это работает.

someHeader.h
inline int someVar;

У меня нет проблем со ссылками / множественными определениями, и это "просто работает"...;-)

Это очень удобно для "быстрых" тестов... Старайтесь избегать глобальных изменений, потому что каждый так говорит...; -)

Объявить extern int x;в file.h. И определитьint x; только в одном cpp файле.cpp.

Другие вопросы по тегам