空枚举的大小是 4 英寸C++
how sizeof empty enum is 4 in C++?
考虑以下程序(在此处查看现场演示(
#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
除非 枚举器不能放入int
或unsigned int
中。如果枚举器列表为空,则基础类型就像枚举具有值为 0 的单个枚举器一样。
因此,枚举器的基础类型(确定其大小(就像它有一个 0,尽管实际类型是实现定义的。它可以是 1(int8_t
当然可以容纳 0(,但绝对不会大于 4。在这种情况下,你得到 4,这是完全合理的。
对于 C,语法只需要有一个枚举器。
与 C 相反,C++ 确实允许空枚举。[dcl.enum]/7:
如果枚举器列表为空,则基础类型类似于 枚举具有一个值为
0
的枚举器。
基础类型(其大小通常也是枚举大小(实际上是实现定义的,尽管大多数编译器可能会选择int
(并且不允许在此处选择更大的任何内容(:
它是实现定义的,哪个整型用作 基础类型,但基础类型不得更大 比
int
,除非枚举器的值无法放入int
或unsigned 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是一种完全不同的语言,有自己的语法规则。