2011-09-19 33 views
3

我有一个头文件,它有一些静态变量供我所有的文件使用。我在那里有一个布尔变量初始化为0 -不理解静态布尔行为

//in utility.h 
static bool read_mess = false; 
,我想改变为true,如果--view读取的消息是在命令行参数,以便我可以做这样的事情,当我得到

来自客户端的消息 -

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

在主,我检查该命令行参数并设置变量,read_mess,真 -

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

我可以将此林后打印read_mess的值它主要说它是真的。但是当我在上面发布的if语句中检查它的真实性时,read_mess会回到false。为什么会发生?我相信它只是简单的东西,但我似乎无法使它工作。每次我做UTILITY_H ::时,utility.h中的所有变量都会重新初始化吗?如果是这样,为什么?

+0

此外,我将变量移动到一个主静态,但也有同样的问题。 – Sterling

+2

WTF是'UTILITY_H'? –

+0

这可能是愚蠢的,但只是为了澄清这一点 - 你确定你没有做'if(UTILITY_H :: read_mess = false){}'吗? –

回答

7

static在此上下文中表示“本地”(指向翻译单元)。在你的程序中会有多个read_mess的副本,每个翻译单元一个是而不是与头文件相同。 (在你的情况下,你最有可能将“翻译单位”近似为.cpp或.c或.cc文件)。

你的意思做大概是什么是声明extern变量,或static类成员在短短的一个翻译单元定义它。

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

extern bool read_mess; 

但在有且仅有一个其他地方,是不是头:

bool read_mess = false; 
+1

非常感谢您的信息。有一个问题 - 当我在一个类的.cpp中定义extern时,它工作正常。但如果我在main中这样做,它甚至不会编译(未定义的引用)。这是为什么? – Sterling

+0

我想你还有另一个问题 - 'UTILITY_H ::'很*很奇怪。我通常会认为'UTILITY_H'是一个后卫​​宏。如果这是偶然的,你的工作将会奏效,但我强烈建议你咨询一本好书或者可能提出另一个问题。请参阅http://sscce.org/获取关于如何编写一个好问题的建议,但好的问题通常会发布*最少的*完整的代码来演示有问题的问题,以及一些解释什么是意外元素的文本。 – Flexo

1

当声明在头文件中,其中包含在该文件中的静态变量的staic变量的副本被在每个Translation unit(头+源文件)创建。

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

如果您想要通过不同文件访问变量,最好使用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提供了一个优越的选择。

+0

re your flag:国防部对此无能为力。留意一下,如果他们不恢复,你将不得不向团队发送电子邮件@ StackOverflow。只有开发人员可以帮助你。 – Will

+0

据我所知,弃用已在C++ 11中被撤销。 – Trass3r

1

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

解决办法是删除static关键字,或用extern替换。并且,将该变量的定义仅放入任何.c或.cpp文件中的