Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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;

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

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