2011-09-19 36 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文件中的