【问题标题】:C++ Global variable declarationC++ 全局变量声明
【发布时间】:2013-11-12 12:49:59
【问题描述】:


我想要做的只是在头文件中定义一个变量,并在两个不同的 cpp 文件上使用它,而无需在每次包含该头文件时重新定义该变量
这是我的尝试:

变量.h

#ifndef VARIABLES_H // header guards
#define VARIABLES_H

static bool bShouldRegister;

#endif

(我也尝试了 extern,但没有任何改变)

在一个 cpp 文件中,我给它一个值 ::bShouldRegister = truebShouldRegister = true;

在我的另一个 cpp 文件中,我通过创建一个线程来检查它的值并在循环中检查它的值(是的,我的线程函数运行良好)

 while (true)
 {
     if (::bShouldRegister) // Or if (bShouldRegister)
        {
            MessageBox(NULL,"Value Changed","Done",MB_OK|MB_ICONINFORMATION);
        }
  Sleep(100);
 }

是的,MessageBox 永远不会出现(bShouldRegister 永远不会变为真:/)

【问题讨论】:

标签: c++ variables global-variables


【解决方案1】:

您必须使用extern,否则您将在每个翻译单元中使用可能不同的值分隔bShouldRegister 变量。

把它放在头文件(.h)中:

extern bool bShouldRegister;

把它放在一个实现文件(.cpp)中:

bool bShouldRegister;

【讨论】:

  • 正如我所说,我按照你说的做了,但没有任何改变
  • 因此,您的代码并未显示您如何使用此全局值。但显而易见的是你应该使用extern
  • 我应该在两个 cpp 文件中都包含我的头文件,对吗?如果是,我已经这样做了
  • 你可以在任何你想要的地方包含头文件。但你不应该在任何地方包含 cpp 文件。请注意,您应该在单个 cpp 文件中只定义一个 bShouldRegister
  • @Shahriyar 你删除了“static bool bShouldRegister;”吗?从标题并将其更改为“extern bool bShouldRegister;”?
【解决方案2】:

如果可以使用 C++17,请考虑使用内联变量:

// in a header file
inline bool bShouldRegister = true;

更多信息请参见How do inline variables work?

【讨论】:

  • 这真是一个救命稻草……在 2019 年使用 extern 真的很烦人
【解决方案3】:

更多C++-like way 将使用类成员,语法上由static 关键字指示。类成员变量具有隐式external 链接。

#ifndef VARIABLES_H
#define VARIABLES_H

class RegUtil {
public:

    static bool bShouldRegister;

};

#endif

在您的一个 cpp 文件(可能是 variables.cpp)中,您必须定义此类成员:

#include "variables.h"

bool RegUtil::bShouldRegister;

【讨论】:

  • 恕我直言,这几乎比 c++ 更像 java,我宁愿把它放在命名空间中并删除类
  • @user463035818 这两个选项都有意义,但我认为类倾向于提供比命名空间更窄的上下文。我通常会尝试避免暴露“裸”的简单变量,尤其是布尔值。 PS:是的,你是对的:我从 Java 中了解了静态成员变量,但它在 C++ 中也是一个合理的选择(我从未将 Java 用于生产代码)。
【解决方案4】:

您需要在其中一个模块中定义变量:

bool bShouldRegister;

然后在标题中声明extern(不是static!):

extern bool bShouldRegister;

【讨论】:

    【解决方案5】:

    这里你需要在一个类中定义bool bShouldRegister。你的头文件应该是这样的。

     #ifndef VARIABLES_H // header guards
    #define VARIABLES_H
    
    class abc{
    
    public:
          bool bShouldRegister;
          abc();
    #endif
    

    现在在 abc 类的构造函数中初始化 cpp 文件中的 bShouldRegister 变量,然后使用类的对象在第二个 cpp 文件中使用此变量。你会得到你的消息框。

    【讨论】:

    • 请再看看你的“答案”,它语法错误
    • 在 abc 类的构造函数中初始化 cpp 文件中的 bShouldRegister 变量 -- 对于静态成员,这是一个不好的建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2011-06-30
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    相关资源
    最近更新 更多