快速的問題:枚舉範圍
如果我有這樣的枚舉:
enum EnumA
{
stuffA = 0
};
enum enumAA
{
stuffA = 1
};
當你是指什麼stuffA
這裏發生了什麼?我以爲你會像在java中那樣引用它們,如EnumA.stuffA
和EnumB.stuffA
,但似乎並非如此。
感謝您的任何洞察力
編輯 - 感謝您的快速回復!
快速的問題:枚舉範圍
如果我有這樣的枚舉:
enum EnumA
{
stuffA = 0
};
enum enumAA
{
stuffA = 1
};
當你是指什麼stuffA
這裏發生了什麼?我以爲你會像在java中那樣引用它們,如EnumA.stuffA
和EnumB.stuffA
,但似乎並非如此。
感謝您的任何洞察力
編輯 - 感謝您的快速回復!
enums
不引入新的範圍。
在您的示例中,第二個enum
由於stuffA
名稱衝突而無法編譯。
爲了避免名稱衝突,通常會給enum
的元素設置一個通用前綴。不同的前綴將被用於不同的枚舉:
enum EnumA
{
EA_stuffA = 0
};
enum EnumAA
{
EAA_stuffA = 1
};
枚舉常數在全局命名空間(更確切地說,是普通標識符名字空間,有標籤,標籤和結構/聯合成員的命名空間對比),所以你在第二個stuffA
上得到編譯錯誤。
在單個翻譯單元中,不能使用相同枚舉名稱的兩個不同值(也不能指定兩次相同的值)。
如上所述,這將不會編譯,因爲stuffA被定義兩次。枚舉值僅由枚舉引用(即「stuffA」而不是EnumA.stuffA)。您甚至可以將它們用於不是枚舉的類型(如整數)。枚舉有時以int的形式使用,類似於#define常量。
在C中,'enum'常量*根據標準的定義是* int。 –
正如其他人已經說過的,枚舉常量在它們被定義的實際範圍內必須是唯一的。但與其他標識符一樣,可以在另一個範圍內重新定義它們。例如。
enum EnumA
{
stuffA = 0
};
void func(void) {
enum enumAA
{
stuffA = 1
};
// do something
}
會沒事的。但是在不同範圍內的這種重新定義往往不被看好,應該記錄良好,否則你很快就會放棄自己和其他人。
+1幸運的是,帶'-Wshadow'的gcc給出了'警告:'stuffA'聲明瞭一個全局聲明'。 –
所以如果我想完成像上面這樣的事情(狹義範圍),結構會是我唯一/最好的選擇嗎? – prelic
你必須使用一些東西:'enum enumA {enumA_stuffA = 0;枚舉enumAA {enumAA_stuffA = 1};' –