枚举范围

pre*_*lic 10 c enums

快速提问:

如果我有这样的枚举:

enum EnumA
{
  stuffA = 0
};
enum enumAA
{
  stuffA = 1
};
Run Code Online (Sandbox Code Playgroud)

你提到的时候会发生什么stuffA?我以为你会提到他们喜欢EnumA.stuffAEnumB.stuffA在Java中,但似乎并不如此.

感谢您的任何见解

编辑 - 感谢您的快速回复!

NPE*_*NPE 9

enums 不要引入新的范围.

在您的示例中,enum由于stuffA名称冲突,第二个将无法编译.

为了避免名称冲突,通常的做法是给出enum一个公共前缀的元素.不同的前缀将用于不同的枚举:

enum EnumA
{
  EA_stuffA = 0
};
enum EnumAA
{
  EAA_stuffA = 1
};
Run Code Online (Sandbox Code Playgroud)


Jon*_*ler 7

枚举常量位于全局名称空间中(更准确地说,是普通标识符名称空间,与标签,标记和结构/联合成员命名空间形成对比),因此您在第二个上获得编译错误stuffA.

在单个转换单元中,不能对同一枚举名称使用两个不同的值(也不能使用指定两次的相同值).


Jen*_*edt 6

正如其他人已经说过的,枚举常量在定义它们的实际范围内必须是唯一的.但与其他标识符一样,它们可以在另一个范围内重新定义它们.例如.

enum EnumA
{
  stuffA = 0
};

void func(void) {
   enum enumAA
   {
     stuffA = 1
   };
   // do something
}
Run Code Online (Sandbox Code Playgroud)

没关系.但是在不同范围内的这种重新定义往往是不受欢迎的,应该有很好的文档记录,否则你会很快失去自己和他人.

  • +1幸运的是,带有`-Wshadow`的gcc给出了警告:声明'stuffA'会影响全局声明. (3认同)