6

我发布了另一个问题:我应该使用哪种类型的 C 枚举的二进制表示?,通过答案,我必须知道我的编译器的枚举数据类型。

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

4

3 回答 3

9

像大多数(所有,也许)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-18T06:56:51.427 回答
2

除了卡尔的答案之外,如果其中任何一个更适合,它甚至可能与有符号或无符号类型兼容。例如,它可以但不能在

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

small一个signed charbig一个unsigned char

顺便说一句,常量m,不是枚举类型,但总是a类型。bint

编辑:我刚刚测试了大于int. 在 C99 模式下gcc会发出错误(这是正确的),但clang只会发出警告,并且具有更广泛的类型来表示enum.

于 2010-08-18T07:04:17.830 回答
1

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

如果您真的想知道,只需询问编译器:

printf("%d\n", sizeof(enum myEnumType));
于 2010-08-18T06:56:19.490 回答