在开源代码中,我发现了一个枚举初始化,看起来像这样:
enum example {
FIRST,
FIRST_AGAIN = FIRST,
SECOND,
ETC
};
我很惊讶如何初始化枚举的值,因为FIRST_AGAIN
会获得值0
,因为FIRST
也是0
。但我认为当FIRST
值为-1
时,FIRST_AGAIN
值可能会影响0
。
因此,我查看了调试器为关键字分配了哪些值。 FIRST
和FIRST_AGAIN
分配了0
。
所以,我的问题是,它是否真的允许(GCC编译它,但C ++标准说的是什么?)在具有相同值的enumaration中分配两个关键词?编译器如何翻译作业?因为要知道FIRST
的值,编译器应首先遍历整个枚举并查看是否分配了任何关键字,从那里返回,他可以分配所有其他值,但他不知道是什么作业FIRST_AGAIN = FIRST
表示。
也许这个问题很愚蠢,做这样的事情也很常见。分配两个具有相同值的关键词有什么好处?
答案 0 :(得分:2)
所以,我的问题是,是否真的允许(GCC编译它,但C ++标准说的是什么?)在具有相同值的enumaration中分配两个关键词?
没关系。 C ++标准在规范性文本中没有说明任何内容,因此它是隐含允许的,但确实包含了一个例子:
enum { a, b, c=0 };
将a
和c
定义为零。
编译器如何翻译作业?因为要知道
FIRST
的值,编译器应该首先遍历整个枚举
不,编译器不需要这样做。没有显式值的枚举器定义并不依赖于以后的枚举器定义。它的值是前一个枚举数的值加1,如果没有先前的枚举数,则为零。
也许这个问题很愚蠢,做这样的事情也很常见。分配两个具有相同值的关键词有什么好处?
一种可能性:
enum E {
A = 20,
B = 30,
C = 40,
MIN = A,
MAX = C
}
此处,MIN
和MAX
的值可能会在添加或删除枚举数时发生变化,但A
,B
和{的值可能会发生变化预计{1}}将保持不变。通过使用需要C
的{{1}},以及需要范围的C
和C
,代码可以适用于以后版本的任何库定义此枚举的未来版本。