我有一个头文件,其中包含一些静态变量供我使用的所有文件。我有一个布尔变量,在那里初始化为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中的所有变量吗?如果是这样,为什么?
答案 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文件中将该变量的定义仅放置一次。