Как объявить глобальную переменную в 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.