在C ++中,sizeof空枚举的大小是4?

时间:2015-10-23 16:41:39

标签: c++ c gcc enums

考虑以下计划(参见实时演示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中不允许使用空枚举?

5 个答案:

答案 0 :(得分:11)

C ++不是C.对于C ++,来自[dcl.enum]:

  

对于其基础类型未修复的枚举,基础类型是可以的整数类型   表示枚举中定义的所有枚举器值。 [...]它是实现定义的,使用整数类型   作为基础类型,除了基础类型不应大于int,除非a的值   枚举器无法容纳intunsigned int。如果枚举器列表为空,则基础类型为,就好像枚举具有值为0的单个枚举器

因此,枚举数的基础类型(确定其大小)就好像它中有一个0,尽管实际类型是实现定义的。它可以是1(int8_t当然可以容纳0),但绝对不能大于4.在这种情况下,你得到4,这是完全合理的。

对于C语言,语法只需要一个枚举器。

答案 1 :(得分:4)

与C相反,C ++确实允许空枚举。 [dcl.enum] / 7:

  

如果枚举器列表为空,则基础类型就像是   枚举有一个值为0的枚举器。

底层类型(其大小通常也是枚举大小)实际上是在您的情况下实现定义的,尽管大多数编译器可能会选择int(并且不允许在此处选择更大的内容):< / p>

  

实现定义了哪个整数类型用作   基础类型,但基础类型不应该更大   除int之外,枚举者的值不能适合intunsigned int   {{1}}。

C对“基础类型”具有相同的要求(尽管C中不存在该确切概念),但其语法首先不允许空枚举 - §6.7.2.2/ 1:

  

枚举器列表
枚举器
枚举器列表枚举器 < / p>

答案 2 :(得分:2)

你是对的。你不能在C中有一个空的枚举器列表。但是你可以在C ++中使用它。请参阅http://en.cppreference.com/w/c/language/enumhttp://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 标识符

枚举列表的:
枚举
枚举列表 枚举器

对于有点不稳定的格式,我试图尽可能接近地重新创建(建议的)标准的段落。