我今天目睹了一种enum
的形式,它是按照VS 2017编译的:
enum ens en1, en2, en3;
然后按原样使用:
int n = en2;
所以我的问题是,enum
是什么形式?为什么后来将n
设置为0
?
enum ens en1, en2, en3;
int main()
{
int n = en2;
}
使用默认的编译器选项进行编译,而不会发出警告
答案 0 :(得分:3)
此示例是不正确的,因为枚举的声明必须包含底层类型或项目列表。这也意味着它不能与变量声明结合使用。固定变体:
enum ens: int; // ens is a complete type at this point
enum ens en1, en2, en3; // en1 en2 en3 are global variables of enum ens type
// alternative "traditional" enum definition with empty list of items:
enum ens{} en1, en2, en3;
int n = en2;
使n
等于0,因为en2
是全局变量,并且隐式初始化为0。
答案 1 :(得分:1)
enum ens en1, en2, en3;
是没有枚举声明。这是变量声明。它声明了enum ens
类型的 3个变量。稍后将在代码中使用它们。
在分配
int n = en2;
en2
的值恰好具有一个与整数值0相对应的枚举值。
答案 2 :(得分:1)
这是不合格的代码,它是扩展名,我们可以看到if we use /Za MSVC也拒绝了该代码。
我们可以从dcl.enum#2中看到这是错误的格式:
使用仅枚举的枚举键声明的枚举类型是无作用域的枚举,其枚举数是无作用域的枚举数。 枚举键枚举类和枚举结构在语义上是等效的;用其中之一声明的枚举类型是作用域枚举,其枚举器是作用域枚举器。 可选的标识符在范围枚举的声明中不应省略。 枚举库的类型说明符序列应命名为整数类型;任何简历资格将被忽略。 声明不受限枚举的不透明枚举声明不应省略枚举库。 ...
在n2764中添加了该措辞,只要指定了基础类型,就可以向前声明枚举。
有关为何不允许我们在没有基础类型的情况下转发声明的枚举的更多详细信息,请参见Why must an enumeration's size be provided when it is forward declared?