Я знаю, что нельзя использовать глобальные переменные, но мне нужно их. Я прочитал, что любая переменная, объявленная вне функции, является глобальной переменной. Я сделал это, но в другом файле *.cpp этой переменной не удалось найти. Так что это было нереально глобально. Разве это не значит, что нужно создать файл заголовка GlobalVariabels.h и включить этот файл в любой другой файл cpp, который его использует?
Как объявить глобальную переменную в С++
Ответ 1
Я прочитал, что любая переменная, объявленная вне функции, является глобальной переменной. Я сделал это, но в другом файле *.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 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;
Весь этот malarky примерно эквивалентен беспорядку, который вы просматриваете, делая функции видимыми/используемыми по границам TU, но с некоторыми отличиями в том, как вы это делаете.
Ответ 2
Вы объявляете переменную как extern
в общем заголовке:
//globals.h
extern int x;
И определите его в файле реализации.
//globals.cpp
int x = 1337;
Затем вы можете включить заголовок везде, где вам нужен доступ.
Я предлагаю вам также обернуть переменную внутри namespace
.
Ответ 3
В дополнение к другим ответам здесь, если значение является интегральной константой, будет работать публичное перечисление в классе или структуре. Другим вариантом является переменная - константа или иначе - в корне пространства имен, или статический открытый член класса или структуры - третий вариант.
MyClass::eSomeConst (enum)
MyNamespace::nSomeValue
MyStruct::nSomeValue (static)
Ответ 4
Не уверен, что это правильно в каком-то смысле, но мне кажется, что это работает.
someHeader.h
inline int someVar;
У меня нет проблем со ссылками/множественными определениями, и это "просто работает"...; -)
Это очень удобно для "быстрых" тестов... Старайтесь избегать глобальных изменений, потому что каждый так говорит...; -)