如何在C ++中声明全局variables

我知道一个人不应该使用全局variables,但我需要他们。 我已经读过任何在函数外部声明的variables是一个全局variables。 我已经这样做了,但在另一个* .cpp文件中找不到该variables。 所以这不是全球性的。 是不是这样,人们必须创build一个头文件GlobalVariabels.h并将该文件包含到任何其他使用它的* cpp文件?

我已经读过任何在函数外部声明的variables是一个全局variables。 我已经这样做了,但在另一个* .cpp文件中找不到该variables。 所以这不是全球性的。

根据范围的概念,你的variables全局的。 但是,您阅读/理解的内容过于简单。


可能性1

也许你忘了在另一个翻译单元(TU)中声明variables。 这是一个例子:

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中的头文件中,也包含在任何其他需要使用x TU中。


可能性2

此外,variables可能具有内部链接 ,这意味着它不会跨翻译单元显示。 如果variables被标记为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; 

这整个malarky大致相当于你在TU边界使function可见/可用的混乱,但在你如何去做它有一些差异。

你在一个通用的头文件中声明variables为extern

 //globals.h extern int x; 

并在一个实现文件中定义它。

 //globals.cpp int x = 1337; 

然后,您可以在需要访问的地方包含标题。

我build议你也将这个variables包含在一个namespace

除了这里的其他答案,如果该值是一个整数常量,类或结构中的公共枚举将起作用。 variables – 常量或其他 – 在名称空间的根部是另一个选项,或者类或结构的静态公共成员是第三个选项。

 MyClass::eSomeConst (enum) MyNamespace::nSomeValue MyStruct::nSomeValue (static)