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

Des*_*tor 3 c c++ enums gcc

考虑以下程序(请参阅此处的实时演示)

#include <iostream>
int main()
{
    enum days{}d;
    std::cout<<sizeof(d);
}
Run Code Online (Sandbox Code Playgroud)

在使用g ++ 4.8.1进行编译时,它在本地计算机上打印4作为输出.它如何在这里占用4个字节?在给定链接中的gcc 6.0上,我也使用了`-pedantic-option,但它编译得很好.

那么为什么它不允许在C?我在gcc 4.8.1中尝试了以下程序.(在这里查看现场演示)

#include <stdio.h>
int main(void)
{
    enum days{}d;
    printf("sizeof enum is %u",sizeof(d));
}
Run Code Online (Sandbox Code Playgroud)

编译器给出以下错误:

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
Run Code Online (Sandbox Code Playgroud)

是否允许在C++中使用空枚举但在C中不允许使用空枚举?

Bar*_*rry 11

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

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

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

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

  • @Ramana从C++ 11开始,你可以声明`enum foo:int {}`. (3认同)