C ++双重枚举值赋值

时间:2018-05-28 08:07:46

标签: c++ enums

在开源代码中,我发现了一个枚举初始化,看起来像这样:

enum example {
    FIRST,
    FIRST_AGAIN = FIRST,
    SECOND,
    ETC
};

我很惊讶如何初始化枚举的值,因为FIRST_AGAIN会获得值0,因为FIRST也是0。但我认为当FIRST值为-1时,FIRST_AGAIN值可能会影响0

因此,我查看了调试器为关键字分配了哪些值。 FIRSTFIRST_AGAIN分配了0

所以,我的问题是,它是否真的允许(GCC编译它,但C ++标准说的是什么?)在具有相同值的enumaration中分配两个关键词?编译器如何翻译作业?因为要知道FIRST的值,编译器应首先遍历整个枚举并查看是否分配了任何关键字,从那里返回,他可以分配所有其他值,但他不知道是什么作业FIRST_AGAIN = FIRST表示。

也许这个问题很愚蠢,做这样的事情也很常见。分配两个具有相同值的关键词有什么好处?

1 个答案:

答案 0 :(得分:2)

  

所以,我的问题是,是否真的允许(GCC编译它,但C ++标准说的是什么?)在具有相同值的enumaration中分配两个关键词?

没关系。 C ++标准在规范性文本中没有说明任何内容,因此它是隐含允许的,但确实包含了一个例子:

enum { a, b, c=0 };

ac定义为零。

  

编译器如何翻译作业?因为要知道FIRST的值,编译器应该首先遍历整个枚举

不,编译器不需要这样做。没有显式值的枚举器定义并不依赖于以后的枚举器定义。它的值是前一个枚举数的值加1,如果没有先前的枚举数,则为零。

  

也许这个问题很愚蠢,做这样的事情也很常见。分配两个具有相同值的关键词有什么好处?

一种可能性:

enum E {
  A = 20,
  B = 30,
  C = 40,
  MIN = A,
  MAX = C
}

此处,MINMAX的值可能会在添加或删除枚举数时发生变化,但AB和{的值可能会发生变化预计{1}}将保持不变。通过使用需要C的{​​{1}},以及需要范围的CC,代码可以适用于以后版本的任何库定义此枚举的未来版本。