2011-12-09 92 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'声明了一个全局声明'。 –