不了解静态布尔行为

Don't understand static boolean behavior

本文关键字:布尔行 静态 不了解      更新时间:2023-10-16

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

//in utility.h
static bool read_mess = false;

,如果——view-read-messages在命令行参数中,我想将其更改为true,以便我可以在从客户端获得消息时执行类似的操作-

//code from a different file
if(UTILITY_H::read_mess)
    std::cout<<"nMessage successfully received from Client 2: "<<in2;

在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;
}

我可以在main的这行之后打印read_mess的值,它说它是真的。但是当我在上面发布的if语句中检查它是否为真时,read_mess又回到了假。为什么会发生这种情况?我相信这只是简单的东西,但我似乎不能使它工作。每次执行UTILITY_H::时,是否都重新初始化了utility.h中的所有变量?如果是,为什么?

static在此上下文中表示"local"(对于翻译单元)。在您的程序中将有多个read_mess副本,每个翻译单元一个,它是而不是,与头文件相同。(在您的情况下,您很可能将"翻译单元"近似为。cpp或。c或。cc文件)。

可能你想做的是声明一个extern变量,或static 类成员定义它在一个翻译单元。

在实践中使用extern意味着在你的头文件中你想写:

extern bool read_mess;

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

bool read_mess = false;

static全局变量是每个。c或。cpp文件(或翻译单元)的私有变量。如果你打印出read_mess的地址(例如,printf("%x", &read_mess);),你会看到不同的地址,这意味着存在两个独立的布尔变量副本。

一个解决方案是删除static关键字,或替换为extern。并且,在任何.c或.cpp文件中只放置该变量的定义一次

当您在头文件中声明静态变量时,将在包含该文件的每个翻译单元(头文件+源文件)中创建该静态变量的副本。

您正在检查静态变量的值,该变量是为该翻译单元定义的副本,它与您在另一个翻译单元中初始化的值不同。

如果您希望跨不同文件访问变量,最好使用extern

utility.h -将此包含在您想要访问read_mess的所有文件中

extern bool read_mess;  

File1.cpp -在一个源文件中定义read_mess

#include"utility.h"
bool read_mess = false;

File2.cpp -在任何源文件中访问read_mess

#include "utility.h"
if(read_mess)
{
    //do what interests you
}

,

c++ 03标准:7.3.1.1/2说:

在命名空间范围内声明对象时不建议使用static关键字,unnamed-namespace提供了一个更好的选择。