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

时间:2010-08-18 06:42:11

标签: c enums clang types

我发布了其他问题:What type should I use for binary representation of C enum?,答案是,我必须知道我的编译器的枚举数据类型。

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

3 个答案:

答案 0 :(得分:8)

与大多数(全部,可能)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

标准要求的全部是:

  

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

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

答案 1 :(得分:2)

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

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

small中的signed charbig中的unsigned char

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

修改:我刚刚测试的值大于int。在C99模式下,gcc会发出错误(这是正确的),但clang仅发出警告,而且代表enum的类型较宽。

答案 2 :(得分:1)

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

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

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