C++ Don';我不理解静态布尔行为

C++ Don';我不理解静态布尔行为,c++,static,header,boolean,C++,Static,Header,Boolean,我有一个头文件,其中有一些静态变量供我的所有文件使用。其中有一个布尔变量初始化为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 succ

我有一个头文件,其中有一些静态变量供我的所有文件使用。其中有一个布尔变量初始化为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的值,它说这是真的。但当我在上面发布的if语句中检查它是否为真时,read_mess又回到了false。为什么会发生这种情况?我相信这只是简单的事情,但我似乎无法让它起作用。每次执行实用程序时,实用程序.h中的所有变量都重新初始化了吗?如果是,原因是什么?

在头文件中声明静态变量时,会在包含该文件的每个(头+源文件)中创建staic变量的副本

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

如果要跨不同的文件访问变量,最好使用
外部程序

utility.h-将其包含在您要访问的所有文件中
read\u mess

extern bool read_mess;  
File1.cpp-在一个源文件中定义
read\u mess

#include"utility.h"

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

if(read_mess)
{
    //do what interests you
}
File2.cpp-访问任何源文件中的
read\u mess

#include"utility.h"

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

if(read_mess)
{
    //do what interests you
}

而且

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

在命名空间范围中声明对象时,不推荐使用static关键字,提供了一个更好的选择


static
在本上下文中表示“本地”(对于翻译单元)。您的程序中将有多个
read_mess
,每个翻译单元一个,这与头文件不同。(在您的情况下,您最有可能将“翻译单位”近似为.cpp或.c或.cc文件)

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

实际上,使用
extern
意味着要在头文件中写入:

extern bool read_mess;
但在一个且唯一一个不是标题的地方:

bool read_mess = false;

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


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

此外,我将该变量移动到了一个主静态,但存在相同的问题。这可能很愚蠢,但只是为了澄清这一点-您确定您没有执行“if(UTILITY_H::read_mess=false){”“?这将在包含标头的每个.cpp文件中创建一个静态变量。那不是你想要的。在标题中使用extern关键字,并在其中一个.cpp文件中定义变量。@hans或
static
,但是是类成员。非常感谢您提供的信息。但有一个问题——当我在类的.cpp中定义extern时,它工作得很好。但如果我主要这样做,它甚至不会编译(未定义的引用)。为什么呢?我想你也有另一个问题-
实用工具:
很奇怪。我通常会假设
UTILITY\u H
是一个保护宏。如果这是一个偶然的机会,那么你所拥有的将起作用,但我强烈建议你查阅一本好书,或者问另一个问题。关于如何编写好的问题,请参阅,好的问题通常会发布最少的完整代码来演示问题,以及一些解释意外元素的文本。re your flag:mod对此无能为力。注意,如果他们不回复,你必须给team@StackOverflow发送电子邮件。在这一点上,只有开发人员可以帮助您。据我所知,在C++11中,这种不推荐已被撤销。