快速的问题:枚举范围
如果我有这样的枚举:
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};' –