我发布了另一个问题:我应该使用哪种类型的 C 枚举的二进制表示?,通过答案,我必须知道我的编译器的枚举数据类型。
Clang 编译器上 C 枚举的数据类型是什么?
我发布了另一个问题:我应该使用哪种类型的 C 枚举的二进制表示?,通过答案,我必须知道我的编译器的枚举数据类型。
Clang 编译器上 C 枚举的数据类型是什么?
像大多数(所有,也许)C 编译器一样,枚举类型的大小可能会有所不同。这是一个示例程序及其输出:
#include <stdio.h>
typedef enum
{
val1 = 0x12
} type1;
typedef enum
{
val2 = 0x123456789
} type2;
int main(int argc, char **argv)
{
printf("1: %zu\n2: %zu\n", sizeof(type1), sizeof(type2));
return 0;
}
输出:
1: 4
2: 8
该标准所要求的只是:
类型的选择是实现定义的,但应该能够表示枚举的所有成员的值。
快速的网络搜索并没有找到详细说明其行为的铿锵手册,但几乎可以肯定它在某处。
除了卡尔的答案之外,如果其中任何一个更适合,它甚至可能与有符号或无符号类型兼容。例如,它可以但不能在
enum small { m = -1; a = 127; };
enum big { b = 255; };
有small
一个signed char
和big
一个unsigned char
。
顺便说一句,常量m
,不是枚举类型,但总是a
类型。b
int
编辑:我刚刚测试了大于int
. 在 C99 模式下gcc
会发出错误(这是正确的),但clang
只会发出警告,并且具有更广泛的类型来表示enum
.
好吧,编译器可能会选择一个足够大的整数大小,但我猜它会选择一个“本机”大小(“字”=寄存器大小,对于 x86 32 位模式应该是长的,对于 x64 应该是长的)。对于您的私有结构,您不应该关心,但是如果您想将其序列化到文件或通过网络,那么您应该明确使用足够大(例如长)的整数类型,以便您可以使用另一种编译器/语言来获取它没有头痛。
如果您真的想知道,只需询问编译器:
printf("%d\n", sizeof(enum myEnumType));