typedef enum enumStruc_2 {
ENUM_5 = 0xFFFFFFF0, ENUM_6, ENUM_7, ENUM_8
} enumStruc_2;
在这里,枚举的大小是 4 个字节(整数大小(。它如何在 4 个字节内保存其所有枚举成员值? 无论其成员的值如何,枚举大小是否始终为 4 字节?
这取决于实现enum
有多大。 来自 C 标准关于枚举说明符的第 6.7.2.2p4 节:
每个列举的类型应与
char
、有符号整数类型或无符号整数类型。
类型的选择是实现定义的,但应 能够代表所有成员的价值观 的枚举。 枚举类型不完整,直到 紧跟在终止枚举器列表的}
之后 声明,并在此之后完成。
因此,enum
类型的大小可以是int
、char
或任何其他整数类型的大小。 例如,gcc 大小枚举如下所示:
通常,如果 中没有负值,则
unsigned int
枚举,否则int
。如果指定了-fshort-enums
,则如果 有负值它是signed char
的第一个,short
和int
可以表示所有值,否则它是第一个unsigned char
,unsigned short
和unsigned int
可以代表所有 值。
关于每个成员的价值观,第3段指出:
枚举器列表中的标识符声明为 具有类型
int
的常量,并且可能出现在允许的任何位置
。具有=
将其枚举常量定义为常量表达式的值。如果第一个枚举器没有=
,其枚举常量的值为 0。每个后续枚举器没有=
将其枚举常量定义为通过将 1 加 1 获得的常量表达式的值 上一个枚举常量。(使用调查员=
可能会生成枚举常量,其值与同一枚举中的其他值重复。 枚举的枚举器 也称为其成员。
在这种情况下,常量ENUM_5
被显式地赋值0xFFFFFFF0
,所以ENUM_6
是0xFFFFFFF
,ENUM_7
是0xFFFFFFF2
,ENUM_8
是0xFFFFFFF3
。 这些常量中的每一个都需要 4 个字节来存储值,因此此特定enum
的大小必须至少为 4 个字节,尽管它可能更大。
关于:
它如何在 4 个字节内保存其所有枚举成员值?
它不会同时容纳所有 4 名成员。枚举可以容纳这 4 个成员中的一个。您定义的是类型,而不是值。例如:
enum enumStruc_2 e1 = ENUM_5;
enum enumStruc_2 e2 = ENUM_6;
类型的大小不是存储该类型的所有可能值所需的大小。它是存储该类型的一个实例所需的大小。
在 C 和 C++ 中,枚举器sizeof(enumStruc_2)
的大小是该枚举中任何单个元素的大小。
在 C 中,答案是sizeof(int)
。所以这至少是 2。
在C++,答案是sizeof(std::underlying_type<enumStruc_2>::type)
.
当你声明一个枚举时,你会做两件事。 首先是声明一个具有枚举名称的新类型。 此类型是一个整数类型,其大小足以存储枚举内使用的值的最大值,并且除非指定,否则它不会小于int
。
接下来要做的是声明 0 个或多个该类型的常量值。 它们不像类成员变量那样参与枚举的大小,因为它们不是真正的变量。它们只是您可以使用的命名常量,并且具有枚举类型的类型。 这就是为什么你可以拥有尽可能多的枚举值,并且sizeof(enum_name)
永远不会改变。