我发布了另一个问题:What type should I use for binary representation of C enum?,根据答案,我必须知道我的编译器的枚举数据类型。
C enum on Clang编译器的数据类型是什么?
发布于 2010-08-18 06:56:51
像大多数(所有,也许)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
该标准所要求的是:
类型的选择是由实现定义的,但应能够表示枚举的所有成员的值。
快速的网络搜索并没有找到一本关于它的行为说明的手册,但几乎可以肯定的是,它就在某个地方。
发布于 2010-08-18 07:04:18
除了卡尔的回答之外,它甚至可能兼容有符号或无符号类型,如果有任何更适合的话。它可以,但一定不能进去
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
。
发布于 2010-08-18 06:56:19
嗯,编译器可能会选择一个足够大的整数,但我猜它会选择一个“本机”大小(“字”=寄存器的大小,对于x86 32位模式应该是long,对于x64应该是long long )。对于你的私有结构,你不应该在意,但是如果你想把它序列化为一个文件或者通过网络,那么你应该显式地使用一个足够大的整数类型(例如long),这样你就可以用另一种编译器/语言轻松地使用它了。
如果你真的想知道,就去问编译器:
printf("%d\n", sizeof(enum myEnumType));
https://stackoverflow.com/questions/3509552
复制相似问题