Clang编译器的C enum的数据类型是什么?

我发布了其他问题: 我应该使用什么类型的C enum的二进制表示? ,通过答案,我必须知道我的编译器的枚举数据类型。

Clang编译器上C enum的数据类型是什么?

像大多数(所有,可能)C编译器一样,枚举类型的大小可以变化。 这是一个示例程序及其输出:

#include  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 

标准要求的所有内容是:

类型的选择是实现定义的,但应能够表示枚举的所有成员的值。

一个快速的网络搜索没有发现一个指定其行为的铿锵手册,但一个人几乎肯定在某处。

除了Carl的答案之外,它甚至可以与有符号或无符号类型兼容,如果有任何更合适的话。 例如它可以但不能进入

 enum small { m = -1; a = 127; }; enum big { b = 255; }; 

在一个有signed char中有一个small而在unsigned char中有一个big的。

BTW常量mab不是枚举类型,但总是int类型。

编辑:我刚测试的值大于int 。 在C99模式下, gcc会发出错误(这是正确的)但是clang只发出警告而不是更宽的类型来表示enum

好吧,编译器可能会选择足够大的整数,但我猜它会选择“原生”大小(“字”=寄存器的大小,对于x86 32位模式应该很长,对于x64应该很长)。 对于你的私有结构你不应该关心,但如果你想将它序列化到一个文件或通过网络,那么你应该显式使用一个足够大的整数类型(例如很长),这样你就可以用另一个编译器/语言来获取它没有头痛。

如果你真的想知道,请问编译器:

 printf("%d\n", sizeof(enum myEnumType));