如何在 C + + 中声明一个全局变量

我知道不应该使用全局变量,但我需要它们。我曾经读到过,在函数之外声明的任何变量都是全局变量。我已经这样做了,但在另一个 *.cpp文件中,该变量无法找到。所以它不是真正的全球化。是不是必须创建一个头文件 GlobalVariabels.h并将该文件包含到使用它的任何其他 *cpp文件中?

368552 次浏览

我曾经读到过,在函数之外声明的任何变量都是全局变量。我已经这样做了,但在另一个 * 。找不到该变量的 cpp 文件。所以它不是真正的全球性的。

根据 范围的概念,您的变量 是全局的。然而,您所阅读/理解的内容过于简化了。


可能性1

也许你忘记了 声明在另一个翻译单元(TU)中的变量:

心肺复苏术

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

心肺复苏

// 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;放在一个头文件中,这个头文件包含在 心肺复苏中,也包含在最终需要使用 x的任何其他 TU 中。


可能性2

此外,变量可能具有 内部连接装置内部连接装置,这意味着它不会在不同的转换单元之间公开。默认情况下,如果变量被标记为 const([C++11: 3.5/3]) ,则为:

心肺复苏术

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

心肺复苏

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应用到 定义来解决这个问题:

心肺复苏术

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;

我没有链接/多重定义的问题,它“只是工作”... ; -)

它对于“快速”测试非常方便... ... 尽量避免使用全局变量,因为每个人都这么说... ... ; -)

在文件 h 中声明 extern int x;。 并且只在一个 cpp file.cpp 中定义 int x;