不了解静态布尔行为

Ste*_*ing 3 c++ static boolean header

我有一个头文件,其中包含一些静态变量供我使用的所有文件.我有一个布尔变量,在那里初始化为0 -

//in utility.h
static bool read_mess = false;
Run Code Online (Sandbox Code Playgroud)

如果--view-read-messages在命令行参数中,我希望更改为true,这样当我从客户端收到消息时,我可以执行类似的操作 -

//code from a different file
if(UTILITY_H::read_mess)
    std::cout<<"\nMessage successfully received from Client 2: "<<in2;
Run Code Online (Sandbox Code Playgroud)

在main中,我检查命令行参数并将变量read_mess设置为true -

//this is in a for, where temp is the command line arg[i]
else if(strcmp(temp.c_str(), "--view-read-messages") == 0) {
    UTILITY_H::read_mess = true;
}
Run Code Online (Sandbox Code Playgroud)

我可以在main之后打印read_mess的值,它表示它是真的.但是当我在上面发布的if语句中检查它是否为true时,read_mess又回到了false.为什么会这样?我确信它只是简单的东西,但我似乎无法使其发挥作用.每次我使用UTILITY_H时,都会重新初始化utility.h中的所有变量吗?如果是这样,为什么?

Fle*_*exo 7

static在这种情况下意味着"本地"(到翻译单位).将有多个副本read_mess在你的程序中,每个翻译单元是一个一样的东西的头文件.(在您的情况下,您很可能将"翻译单位"近似为.cpp或.c或.cc文件).

您可能要做的是声明一个extern变量或static 类成员,并在一个翻译单元中定义它.

在实践中使用extern你想要写的头文件中的手段:

extern bool read_mess;
Run Code Online (Sandbox Code Playgroud)

但是在一个且只有一个不是标题的地方:

bool read_mess = false;
Run Code Online (Sandbox Code Playgroud)