2011-05-25 45 views
0

比較。我正在使用頭文件的命名空間下命名空間可變

namespace MyNameSpace 
{ 
    extern string data; 
}; 

而且在實現文件的下。

namespace MyNameSpace 
{ 
     string data = "Data"; 
}; 

然後在我的代碼的某些點我比較下。

string mData = "Data"; 

if(mData == MyNameSpace::data) 
{ 
    //do something 
} 

但是,當我比較它不會在段。這可能是什麼原因。

問候, 列寧

+0

我假設你的if語句在if語句中實際上有一個double-equals,對吧? – SirPentor 2011-05-25 06:32:20

+0

所以你有==,仍然有問題?或者那是它? – 2011-05-25 06:38:07

+0

@iSight:常量應該是'const'限定的......你確定數據在比較發生的地方有效嗎? – 2011-05-25 06:40:11

回答

0

我無法確定這是否會導致您的特定問題,因爲我不知道其餘的代碼。但是,應該肯定反正適用:

Google C++ Style Guide

類類型的靜態或全局變量是被禁止的:它們會導致難以發現的錯誤,由於建設和毀滅的不確定的順序。包含全局變量,靜態變量,靜態類成員變量和函數靜態變量的靜態存儲持續時間的對象必須是普通舊數據(POD):僅限整數,字符,浮點數或指針或POD的數組/結構。

調用靜態變量的類構造函數和初始化函數的順序僅在C++中部分指定,甚至可能會從構建變爲構建,這可能會導致難以找到的錯誤。因此,除了禁止類類型的全局變量外,我們不允許使用函數的結果初始化靜態POD變量,除非該函數(如getenv()或getpid())本身不依賴於其他全局變量。

同樣,調用析構函數的順序被定義爲調用構造函數順序的相反方向。由於構造函數的順序是不確定的,因此析構函數的順序也是如此。例如,在程序結束時,一個靜態變量可能已被銷燬,但仍在運行的代碼(可能在另一個線程中)嘗試訪問它並失敗。或者,靜態'string'變量的析構函數可能會在析構函數之前運行,其中包含對該字符串的引用的另一個變量。

因此,我們只允許靜態變量包含POD數據。此規則完全禁止使用vector(使用C數組)或string(使用const char [])。

如果您需要類類型的靜態變量或全局變量,請考慮從main()函數或pthread_once()初始化指針(永遠不會釋放該指針)。請注意,這必須是一個原始指針,而不是一個「智能」指針,因爲智能指針的析構函數將具有我們試圖避免的析構函數問題。

長話短說:永遠不要使用「字符串」類型的constannts。你可能想要使用類似於

const char data[] = "Data"; 
0

你有一個= 這是賦值運算符。

需要MDATA == myNameSpace對象::數據

隨着MDATA = myNameSpace對象::數據 表達式的值,比不同爲零(它是其中的「數據」被存儲在地址) 所以它是真(與零不同的東西都被視爲真)。

編輯: 如果使用gcc編譯,像-Wall這樣的標誌可能會幫助您找到這類錯誤/錯誤。

0

您能否給我們一個小問題的可編輯例子。你發佈的代碼很好,最有可能的是,這兩個變量中的一個並不包含你認爲它所做的事情。