考虑以下计划(参见实时演示here)
#include <iostream>
int main()
{
enum days{}d;
std::cout<<sizeof(d);
}
使用g ++ 4.8.1进行编译时,它会在本地计算机上输出4作为输出。它如何在这里占用4个字节?在给定链接中的gcc 6.0上,我也使用了`-pedantic-option,但它编译得很好。
那么为什么C不允许?我在gcc 4.8.1中尝试了以下程序。 (参见现场演示here)
#include <stdio.h>
int main(void)
{
enum days{}d;
printf("sizeof enum is %u",sizeof(d));
}
编译器会出现以下错误:
4 12 [Error] expected identifier before '}' token
5 36 [Error] 'd' undeclared (first use in this function)
5 36 [Note] each undeclared identifier is reported only once for each function it appears in
是否允许在C ++中使用空枚举但在C中不允许使用空枚举?
答案 0 :(得分:11)
C ++不是C.对于C ++,来自[dcl.enum]:
对于其基础类型未修复的枚举,基础类型是可以的整数类型 表示枚举中定义的所有枚举器值。 [...]它是实现定义的,使用整数类型 作为基础类型,除了基础类型不应大于
int
,除非a的值 枚举器无法容纳int
或unsigned int
。如果枚举器列表为空,则基础类型为,就好像枚举具有值为0的单个枚举器。
因此,枚举数的基础类型(确定其大小)就好像它中有一个0,尽管实际类型是实现定义的。它可以是1(int8_t
当然可以容纳0),但绝对不能大于4.在这种情况下,你得到4,这是完全合理的。
对于C语言,语法只需要一个枚举器。
答案 1 :(得分:4)
与C相反,C ++确实允许空枚举。 [dcl.enum] / 7:
如果枚举器列表为空,则基础类型就像是 枚举有一个值为
0
的枚举器。
底层类型(其大小通常也是枚举大小)实际上是在您的情况下实现定义的,尽管大多数编译器可能会选择int
(并且不允许在此处选择更大的内容):< / p>
实现定义了哪个整数类型用作 基础类型,但基础类型不应该更大 除
int
之外,枚举者的值不能适合int
或unsigned int
{{1}}。
C对“基础类型”具有相同的要求(尽管C中不存在该确切概念),但其语法首先不允许空枚举 - §6.7.2.2/ 1:
枚举器列表:
枚举器
枚举器列表,枚举器 < / p>
答案 2 :(得分:2)
你是对的。你不能在C中有一个空的枚举器列表。但是你可以在C ++中使用它。请参阅http://en.cppreference.com/w/c/language/enum和http://en.cppreference.com/w/cpp/language/enum
答案 3 :(得分:1)
在C ++中,大小为4个字节,因为编译器选择int
作为枚举的基础整数类型。显然{4}在你的平台上是sizeof(int)
。在编译器世界中,默认为枚举表示的int
非常流行(除非需要更大的类型)。
至于为什么C中不允许......嗯,C中不允许这样做,因为C中不允许这样做.C是一种完全不同的语言,有自己的句法规则。
答案 4 :(得分:1)
C11 standard要求枚举声明中至少有一个枚举器(第6.7.2.2节),复制的部分如下:
枚举说明符的:
enum 标识符 opt { 枚举列表 }
enum 标识符 opt { 枚举列表 }
enum 标识符
枚举列表的:
枚举的
枚举列表 , 枚举器
对于有点不稳定的格式,我试图尽可能接近地重新创建(建议的)标准的段落。