将值分配给枚举

时间:2013-07-17 11:57:06

标签: c++ visual-studio-2010 enums

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

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 个答案:

答案 0 :(得分:5)

  

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

我不知道“出错”是什么意思。明确定义如果你没有为枚举器指定一个值,它的值比前一个值多一个(或者如果它是第一个则为零)。

  

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

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

  

有什么理由说C ++标准允许这两种结构吗?

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

答案 1 :(得分:3)

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

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

第一个为其中一个选择分配值,但不为其他选择分配

  

默认情况下,第一个枚举数的值为0,每个连续的枚举数大于前一个枚举数的值,除非您明确指定特定枚举数的值。

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

  

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

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

答案 2 :(得分:1)

我没有标准的引用,但是指定了枚举,使得未初始化的值的值大于它们之前的值。

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

答案 3 :(得分: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 ++标准允许这两种结构吗?

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