不了解静态布尔行为

时间:2011-09-19 18:27:31

标签: 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 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语句中检查它是否为true时,read_mess又回到了false。为什么会这样?我确信它只是简单的东西,但我似乎无法使其发挥作用。每次我使用UTILITY_H时,都会重新初始化utility.h中的所有变量吗?如果是这样,为什么?

3 个答案:

答案 0 :(得分:7)

在此上下文中,

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

您的意图可能是声明 extern变量,或static 类成员定义它只在一个翻译单元中。

实际上,在您要编写的头文件中使用extern表示:

extern bool read_mess;

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

bool read_mess = false;

答案 1 :(得分:1)

当您在头文件中声明静态变量时,会在包含该文件的每个 Translation unit (标题+源文件)中创建一个staic变量的副本。

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

如果要在不同文件中访问变量,最好使用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 提供了更好的选择。

答案 2 :(得分:1)

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

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