【发布时间】:2011-03-31 09:18:43
【问题描述】:
我发布了另一个问题:What type should I use for binary representation of C enum?,通过答案,我必须知道我的编译器的枚举数据类型。
Clang 编译器上 C 枚举的数据类型是什么?
【问题讨论】:
我发布了另一个问题:What type should I use for binary representation of C enum?,通过答案,我必须知道我的编译器的枚举数据类型。
Clang 编译器上 C 枚举的数据类型是什么?
【问题讨论】:
除了 Carl 的回答之外,它甚至可能与有符号或无符号类型兼容,如果其中任何一个更适合的话。例如它可以但不能在
enum small { m = -1; a = 127; };
enum big { b = 255; };
在signed char 中有small,在unsigned char 中有big。
顺便说一句,常量m、a 和b 不是枚举类型,但始终是int 类型。
编辑:我刚刚测试了大于int 的值。在 C99 模式下,gcc 发出错误(这是正确的),但 clang 仅发出警告,并且具有更广泛的类型来表示 enum。
【讨论】:
像大多数(可能是所有)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
标准要求的只是:
类型的选择是实现定义的,但应该能够表示枚举所有成员的值。
快速的网络搜索并没有找到详细说明其行为的 clang 手册,但几乎可以肯定在某处。
【讨论】:
好吧,编译器可能会选择一个足够大的整数大小,但我猜它会选择一个“本机”大小(一个“字”= 寄存器大小,对于 x86 32 位模式应该是长的,对于 x64 应该是长长的)。对于您的私有结构,您不应该关心,但是如果您想将其序列化到文件或通过网络,那么您应该明确使用足够大(例如长)的整数类型,以便您可以使用另一种编译器/语言来获取它没有头痛。
如果你真的想知道,就问编译器吧:
printf("%d\n", sizeof(enum myEnumType));
【讨论】: