【问题标题】:How to declare a global variable in C++如何在 C++ 中声明一个全局变量
【发布时间】:2012-03-30 22:01:18
【问题描述】:

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

【问题讨论】:

  • one should not use global variables 不,不应该一概而论。 I have a need for them 为什么?
  • @Lightness Races in Orbit:我需要它们,因为我想在两个不互相调用的函数之间交换数据。
  • @MarcusTik:好的。至少要确保使用命名空间。
  • "我已经这样做了,但是在另一个 *.cpp 文件中找不到该变量。所以它不是真正的全局变量。" - “全局”意味着它们在程序结束之前不会被销毁(与在块结束时被销毁的具有块范围的局部变量相反。)并且可以从其他翻译单元以某种方式访问​​。详情见:learncpp.com/cpp-tutorial/42-global-variables
  • @undefinedbehaviour:是的。在该示例中,您引入了一个完全不相关的声明点问题。

标签: c++ visual-studio


【解决方案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 中的头文件中,以及最终需要使用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;

这整个问题大致相当于你在使函数跨 TU 边界可见/可用时所经历的混乱,但你的处理方式有所不同。

【讨论】:

  • 我可以将 extern 用于用户定义的类型吗?意味着声明对象而不定义它?
  • @meet:是的,对于任何对象。
  • 如果在非常量变量中包含 extern 关键字,它会起作用吗?是否会有所不同?
  • @AaronFranke:你的意思是,就像上面显示的“可能性 1”?
  • @BoundaryImposition 是
【解决方案2】:

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

//globals.h
extern int x;

并在实现文件中定义它。

//globals.cpp
int x = 1337;

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

我建议您也将变量包装在 namespace 中。

【讨论】:

  • 我认为你也应该在 globals.cpp 中声明变量类型,即int x = 1337int 是默认数据类型,因此在这种情况下它可能会起作用,但是...
  • nm,我只是偶然发现了一次,我花了很长时间才明白编译器到底想要我做什么......
  • @arne:C++ 中没有“默认数据类型”。
  • @LightnessRacesinOrbit:好的,我依稀记得在 C 语言中有类似的东西。如果它不在 C++ 中,我必须撤销我的评论。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    someHeader.h
    inline int someVar;
    

    我没有链接/多重定义问题,而且它“正常工作”... ;-)

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 之前的答案不是已经涵盖了吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 2011-02-12
      • 2012-11-11
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多