空枚举的大小是 4 英寸C++

how sizeof empty enum is 4 in C++?

本文关键字:英寸 C++ 枚举      更新时间:2023-10-16

考虑以下程序(在此处查看现场演示(

#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 中遵循程序。(在此处观看现场演示(

#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 中不允许?

C++不是C。对于C++,从 [dcl.enum]:

对于基础类型

不固定的枚举,基础类型是可以 表示枚举中定义的所有枚举器值。[...]它是实现定义的使用哪种整型 作为基础类型,但基础类型不得大于int除非 枚举器不能放入intunsigned int中。如果枚举器列表为空,则基础类型就像枚举具有值为 0 的单个枚举器一样

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

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

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

如果枚举器列表为空,则基础类型类似于 枚举具有一个值为 0 的枚举器。

基础类型(其大小通常也是枚举大小(实际上是实现定义的,尽管大多数编译器可能会选择int(并且不允许在此处选择更大的任何内容(:

它是实现定义的,哪个整型用作 基础类型,但基础类型不得更大 比int,除非枚举器的值无法放入intunsigned int .


C

对"底层类型"有相同的要求(尽管这个确切的概念在 C 中不存在(,但它的语法首先不允许空枚举 - §6.7.2.2/1:

枚举器列表

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

你是对的。C 中不能有空的枚举器列表。但是你可以在C++拥有它。请参阅 http://en.cppreference.com/w/c/language/enum 和 http://en.cppreference.com/w/cpp/language/enum

C11 标准要求枚举声明中至少有一个枚举器(第 6.7.2.2 节(,下面复制了以下突出部分:

枚举说明符
 enumidentifieropt{enumerator-list}
 enumidentifieropt{enumerator-list}
 枚举标识符

枚举器列表
 枚举器
 枚举器列表枚举器

很抱歉格式有些不稳定,我试图尽可能接近(提议的(标准重新创建段落。

在C++中,大小为 4 个字节,因为编译器选择 int 作为枚举的基础整数类型。显然sizeof(int)在您的平台上是 4。在编译器世界中,枚举表示默认为 int 非常流行(除非需要更大的类型(。

至于为什么在C中不允许...好吧,它在C中是不允许的,因为它在C中是不允许的。 C是一种完全不同的语言,有自己的语法规则。