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

时间:2012-03-14 12:32:55

标签: c++ visual-studio

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

5 个答案:

答案 0 :(得分:72)

  

我已经读过在函数外声明的任何变量都是全局变量。我已经这样做了,但在另一个* .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 中的头文件中,并放入最终需要使用x的任何其他TU中。


可能性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'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边界上使功能可见/可用的混乱,但在你如何处理它时有一些不同。

答案 1 :(得分:51)

您在公共标头中将变量声明为extern

//globals.h
extern int x;

并在实现文件中定义它。

//globals.cpp
int x = 1337;

然后,您可以在需要访问它的任何位置包含标题。

我建议你将变量包装在namespace

答案 2 :(得分:4)

除了这里的其他答案,如果值是一个整数常量,类或结构中的公共枚举将起作用。命名空间根目录下的变量 - 常量或其他 - 是另一种选择,或者类或结构的静态公共成员是第三种选择。

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

答案 3 :(得分:0)

不确定这在任何意义上是否正确,但这似乎对我有用。

someHeader.h
inline int someVar;

我没有链接/多个定义问题,它“有效” ...;-)

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

答案 4 :(得分:0)

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