C++ 为枚举赋值

C++ 为枚举赋值,c++,visual-studio-2010,enums,C++,Visual Studio 2010,Enums,在回顾一些较旧的代码时,我注意到以下两个使用enum的奇怪构造(两个不同的文件/类/名称空间,仅将它们放在一起): 我认为这两种结构都是错误的 第一个选项为其中一个选项指定一个值,但不为其他选项指定一个值,这意味着如果添加新的选项,可能会出现问题 在第二种情况下,我们最终得到两个具有相同基础值的枚举元素 有什么理由允许C++标准允许两种结构?< /P> (使用Visual Studio 2010)我没有标准中的引用,但是指定了枚举,使未初始化值的值大于前面的值 在第一个枚举中,但是一些其他选择将

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


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

第一个选项为其中一个选项指定一个值,但不为其他选项指定一个值,这意味着如果添加新的选项,可能会出现问题

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

有什么理由允许C++标准允许两种结构?< /P>


(使用Visual Studio 2010)

我没有标准中的引用,但是指定了枚举,使未初始化值的值大于前面的值

在第一个枚举中,但是一些其他选择将因此为2(另一个选择+1)。在一个枚举中具有多个等效值也是完全合法的

第一个选项为其中一个选项指定一个值,但不为其他选项指定一个值,这意味着如果添加新的选项,可能会出现问题

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

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

是的,我们有。如果枚举应该是一组唯一的值,但(在C++中)它们不是,那就错了

有什么理由允许C++标准允许两种结构?< /P>

因为在C++中,枚举只是声明一组相关的、命名的、常量值的一种方式。它不试图限制他们可以接受的价值

第一个选项为其中一个选项指定一个值,但不为其他选项指定一个值,这意味着如果添加新的选项,可能会出现问题

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

enum FirstEnum
   {
    A_CHOICE              //0
   ,A_THIRD_CHOICE        //1
   ,ANOTHER_CHOICE=1      //1
   ,YET_SOME_OTHER_CHOICE //2
   };
然后是的,如果他们不希望枚举中的两个值相同,他们将遇到问题。如果有人定义了这些值,并且意外地使其中两个值相同,那么情况也是一样的

对于第二个示例,枚举中的值的名称给出了一个提示,说明了它为什么有用。您可以在
SecondEnum
的定义中存储类型为
SecondEnum
的变量的默认值,允许您执行以下操作

SecondEnum var = DEFAULT_CHOICE;
不需要
#定义与枚举定义紧密耦合但不属于枚举定义一部分的
s或常量

有什么理由允许C++标准允许两种结构?< /P>


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

这篇来自微软的文章应该有帮助:

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

默认情况下,第一个枚举数的值为0,并且每个后续枚举数的值都比前一个枚举数的值大一个,除非为特定枚举数显式指定值

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

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


本文包含了如何利用这些特征的例子。

第二种考虑<代码> EnUM:{大,小,流=小};<代码>“我认为这两种结构都是错误的。”-我也是。。。它们不是预处理器宏,所以它们不应该是大写+下划线。。。自找麻烦。@Tony,这只是惯例问题。用大小写也很奇怪。例如,当“MyNameSpace::FirstChoice”或“MyClass::FirstChoice”不是类时,您会得到它们。使用像s_这样的前缀也很奇怪(MyNameSpace::s_firstChoice)。这只是你在公司指导方针中同意什么的问题。@Patrick:当涉及到所有大写字母时,这就有点复杂了。。。预处理器不支持C++范围——在任何级别-命名空间、类、函数、块。如果翻译单元中的任何地方有一个
#define BIG
,它将阻止以后使用
BIG
作为枚举标识符。因此,根据行业惯例,宏名称应始终为大写,除非它们是标准库/OS库的实现细节,并且经过精心设计以避免出现问题。因此,选择枚举与类等的非大写标识符是公司指南的问题…@Tony,好的,我明白你的意思。你能在回答中引用该页的相关部分吗?我们希望我们的答案不依赖于其他网站。根据要求添加了相关部分:)
SecondEnum var = DEFAULT_CHOICE;