2012-03-11 115 views
1

如果一個包括WINDOWS.H在Visual Studio中的C++文件食一個全局變量的名字,他們然後有一個名爲STANDARD_RIGHTS_ALL定義的全局標識符。我想在我創建的類中使用該名稱作爲靜態成員變量的名稱。我試圖做如下...由靜態成員名稱

class ACLAmigo 
{ 
public: 
    static int STANDARD_RIGHTS_ALL; 
    ACLAmigo(void); 
    ~ACLAmigo(void); 
}; 

後來在另一個文件我有這個...

int ACLAmigo::STANDARD_RIGHTS_ALL = 1; 

但正是如此IDE抱怨:「錯誤:預期的標識符」。

問:我可以用這個已經聲明標識符STANDARD_RIGHTS_ALL作爲成員變量名,如果是的話怎麼辦?

+2

STANDARD_RIGHTS_ALL可能是一個宏。你可以#undef它,但你可能會遇到麻煩。 – 2012-03-11 14:47:03

+0

其實這是一個「#define STANDARD_RIGHTS_ALL(0x001F0000L)」。我實際上不能解開它,因爲我想使用宏名稱將我的變量設置爲該值(一個#define是一個宏是否正確?)。如果我在我的變量名稱前添加一個下劃線,它將起作用。如果我願意的話,我會接受這一點,但不必非得這麼做。 – 2012-03-11 14:49:44

+0

我已經添加了一個處理該問題的答案。 – 2012-03-11 15:00:30

回答

1

問題是,STANDARD_RIGHTS_ALL(和大多數其他事情)是。宏始終是「全局定義的」。此外,在編譯器開始分析代碼之前,它們將由預處理器解析,以便您的代碼變爲:

static int 0x001F0000 /*STANDARD_RIGHTS_ALL*/; 

這是無意義的。

要麼選擇另一個變量名,或取消定義該宏:

#undef STANDARD_RIGHTS_ALL 
static int STANDARD_RIGHTS_ALL; // now it's ok 
+0

謝謝。我正在改變我的變量的名稱。分支問題:是否將持久靜態類成員名稱設置爲全部大寫是否被認爲是標準/最佳實踐? – 2012-03-11 17:49:07

+0

取決於公約。我個人不會這樣。我堅持使用's_'作爲前綴的靜態成員會議 – valdo 2012-03-11 20:28:33

1

好吧,既然STANDARD_RIGHTS_ALL實際上是一個宏:

#define STANDARD_RIGHTS_ALL    (0x001F0000L) 

我會說有做的不安全方式它。

你可以取消定義它:

#undef STANDARD_RIGHTS_ALL 
class ACLAmigo 
{ 
public: 
    static int STANDARD_RIGHTS_ALL; 
    ACLAmigo(void); 
    ~ACLAmigo(void); 
}; 

但是你掉,如果你只是選擇一個不同的名字要好得多。

事實上,這是不確定的行爲取消定義標準宏。這不是一個標準的宏,但也可能導致未定義的行爲。你一定要改名字。

+0

謝謝。我正在改變我的變量的名稱。分支問題:是否將持久靜態類成員名稱設置爲全部大寫是否被認爲是標準/最佳實踐? – 2012-03-11 17:48:39

1

在你的例子中,你將它設置爲1,但我想你實際上想要將它設置爲STANDARD_RIGHTS_ALL宏通常具有的值。

我想你可以完成,像這樣:

class ACLAmigo 
{ 
public: 
    static const int standard_rights_all = STANDARD_RIGHTS_ALL; 
#undef STANDARD_RIGHTS_ALL 
    static const int STANDARD_RIGHTS_ALL = standard_rights_all; 
    ACLAmigo(void); 
    ~ACLAmigo(void); 
}; 

但是這很容易導致問題,如果這發生在被之前使用宏其他頭文件包含的頭文件。