Ответ 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, но с некоторыми отличиями в том, как вы это делаете.