2011-12-09 90 views
6

快速的問題:枚舉範圍

如果我有這樣的枚舉:

enum EnumA 
{ 
    stuffA = 0 
}; 
enum enumAA 
{ 
    stuffA = 1 
}; 

當你是指什麼stuffA這裏發生了什麼?我以爲你會像在java中那樣引用它們,如EnumA.stuffAEnumB.stuffA,但似乎並非如此。

感謝您的任何洞察力

編輯 - 感謝您的快速回復!

回答

7

enums不引入新的範圍。

在您的示例中,第二個enum由於stuffA名稱衝突而無法編譯。

爲了避免名稱衝突,通常會給enum的元素設置一個通用前綴。不同的前綴將被用於不同的枚舉:

enum EnumA 
{ 
    EA_stuffA = 0 
}; 
enum EnumAA 
{ 
    EAA_stuffA = 1 
}; 
+0

所以如果我想完成像上面這樣的事情(狹義範圍),結構會是我唯一/最好的選擇嗎? – prelic

+0

你必須使用一些東西:'enum enumA {enumA_stuffA = 0;枚舉enumAA {enumAA_stuffA = 1};' –

5

枚舉常數在全局命名空間(更確切地說,是普通標識符名字空間,有標籤,標籤和結構/聯合成員的命名空間對比),所以你在第二個stuffA上得到編譯錯誤。

在單個翻譯單元中,不能使用相同枚舉名稱的兩個不同值(也不能指定兩次相同的值)。

1

如上所述,這將不會編譯,因爲stuffA被定義兩次。枚舉值僅由枚舉引用(即「stuffA」而不是EnumA.stuffA)。您甚至可以將它們用於不是枚舉的類型(如整數)。枚舉有時以int的形式使用,類似於#define常量。

+2

在C中,'enum'常量*根據標準的定義是* int。 –

3

正如其他人已經說過的,枚舉常量在它們被定義的實際範圍內必須是唯一的。但與其他標識符一樣,可以在另一個範圍內重新定義它們。例如。

enum EnumA 
{ 
    stuffA = 0 
}; 

void func(void) { 
    enum enumAA 
    { 
    stuffA = 1 
    }; 
    // do something 
} 

會沒事的。但是在不同範圍內的這種重新定義往往不被看好,應該記錄良好,否則你很快就會放棄自己和其他人。

+3

+1幸運的是,帶'-Wshadow'的gcc給出了'警告:'stuffA'聲明瞭一個全局聲明'。 –