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

Mar*_*Tik 53 c++ visual-studio

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

Lig*_*ica 77

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

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


可能性1

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

a.cpp

int x = 5; // declaration and definition of my global variable
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

通常,您将放入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`
Run Code Online (Sandbox Code Playgroud)

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.
}
Run Code Online (Sandbox Code Playgroud)

你可以通过应用解决这个问题extern定义,得:

a.cpp

extern const int x = 5;
Run Code Online (Sandbox Code Playgroud)

整个malarky大致相当于你在TU边界上使功能可见/可用的混乱,但在你如何处理它时有一些差异.


Luc*_*ore 55

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

//globals.h
extern int x;
Run Code Online (Sandbox Code Playgroud)

并在实现文件中定义它.

//globals.cpp
int x = 1337;
Run Code Online (Sandbox Code Playgroud)

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

我建议你也把变量包装在一个namespace.

  • @arne:C++中没有"默认数据类型". (4认同)
  • 我认为你应该在globals.cpp中声明变量类型,即`int x = 1337`.`int`是默认数据类型,因此在这种情况下它可能会起作用,但是...... (2认同)

小智 5

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

MyClass::eSomeConst (enum)
MyNamespace::nSomeValue 
MyStruct::nSomeValue (static) 
Run Code Online (Sandbox Code Playgroud)