4

在回顾一些旧代码时,我注意到以下两个使用枚举的奇怪结构(两个不同的文件/类/命名空间,只是将它们放在一起):

enum FirstEnum
   {
    A_CHOICE
   ,ANOTHER_CHOICE=1
   ,YET_SOME_OTHER_CHOICE
   };

enum SecondEnum
   {
    FIRST_CHOICE
   ,SECOND_CHOICE
   ,THIRD_CHOICE
   ,DEFAULT_CHOICE=SECOND_CHOICE
   };

我认为这两种结构都是错误的。

第一个为其中一个选项赋值,但不为其他选项赋值,这意味着如果添加新选项,事情可能会出错。

在第二种情况下,我们最终得到两个具有相同基础值的枚举元素。

C++ 标准允许这两种结构有什么原因吗?

(使用 Visual Studio 2010)

4

4 回答 4

5

第一个为其中一个选项赋值,但不为其他选项赋值,这意味着如果添加新选项,事情可能会出错。

我不知道你所说的“出错”是什么意思。定义明确的是,如果您不为枚举数指定值,则其值比前一个值大一(或零,如果它是第一个)。

在第二种情况下,我们最终得到两个具有相同基础值的枚举元素。

是的,我们这样做。如果枚举应该是一组唯一值但(在 C++ 中)它们不是,那将是错误的。

C++ 标准允许这两种结构有什么原因吗?

因为,在 C++ 中,枚举只是一种声明一组相关的、命名的常量值的方法。它不会尝试限制他们可以采用的值。

于 2013-07-17T12:03:30.620 回答
3

Microsoft 的这篇文章应该会有所帮助:

http://msdn.microsoft.com/en-us/library/2dzy4k6e(v=VS.80).aspx

第一个为其中一个选项赋值,但不为其他选项赋值

默认情况下,第一个枚举器的值为 0,并且每个后续枚举器的值都比前一个枚举器的值大一个,除非您明确指定特定枚举器的值。

在第二种情况下,我们最终得到两个具有相同基础值的枚举元素。

枚举器在枚举中不需要具有唯一值。每个枚举器的名称都被视为一个常量,并且在定义枚举的范围内必须是唯一的。

本文包括如何利用这些功能的示例。

于 2013-07-17T12:06:09.423 回答
1

我没有为您提供标准的报价,但是指定了枚举,以使未初始化的值的值比它们前面的值大一。

因此,在 FirstEnum 中,YET_SOME_OTHER_CHOICE 将为 2 (ANOTHER_CHOICE+1)。在一个枚举中拥有多个等价值也是完全合法的。

于 2013-07-17T12:02:56.590 回答
1

第一个为其中一个选项赋值,但不为其他选项赋值,这意味着如果添加新选项,事情可能会出错。

可能会出什么问题?当然,如果有人将第一个示例更改为

enum FirstEnum
   {
    A_CHOICE              //0
   ,A_THIRD_CHOICE        //1
   ,ANOTHER_CHOICE=1      //1
   ,YET_SOME_OTHER_CHOICE //2
   };

那么是的,如果他们不期望枚举中的两个值相同,他们会遇到问题。如果有人有#define这些值,并且不小心使它们中的两个相同,那也是一样的。

对于您的第二个示例,枚举中的值的名称暗示了为什么这是有用的。您可以为SecondEnum的定义中存储的类型变量设置默认值SecondEnum,从而允许您执行以下操作

SecondEnum var = DEFAULT_CHOICE;

不需要#define与枚举定义紧密耦合但不属于枚举定义的 s 或常量。

C++ 标准允许这两种结构有什么原因吗?

我不是标准委员会的成员,但如果我猜的话,那是因为这两种结构对程序员都很有用。

于 2013-07-17T12:06:05.170 回答