枚举的大小

时间:2013-07-25 11:27:06

标签: c enums size enumeration sizeof

有人可以解释为什么成员X的大小与枚举类型本身不同,尽管明确定义为LL?我需要转换同一枚举类型的(enum e_x)X成员以确保它与该类型具有相同的大小,这似乎违反直觉。

#include <stdio.h>
#include <limits.h>

enum e_x { X = 0LL, M = LLONG_MAX };

int main() {
 printf("%zu %zu %zu %zu\n",
         sizeof X,
         sizeof((enum e_x)X),
         sizeof(enum e_x),
         sizeof(long long));
}

输出:

 4 8 8 8

预期:

 8 8 8 8

在将枚举传递给使用va_arg的函数时,如何处理它?

3 个答案:

答案 0 :(得分:4)

您期望的行为适用于C ++,但不是C. C不允许非int枚举器。从N1570(~C11)§6.7.2.2/ 2:

  

定义枚举常量值的表达式应为整数常量表达式,其值可表示为int

第3段也说:

  

枚举器列表中的标识符被声明为类型为int的常量,并且可能出现在允许的位置。

Para 4说:

  

每个枚举类型应与char,有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的

sizeof X == sizeof(int)是第3段的结果,大概是sizeof M == 4也是出于同样的原因。该实现显然为枚举类型选择了64位整数类型,因此sizeof(enum e_x) == 8sizeof((enum e_x)X)) == 8也是如此。

答案 1 :(得分:1)

听起来你真正的问题涉及将长参数传递给具有可变参数的函数:

“在将枚举传递给使用va_arg的函数时,如何处理它?”

你可能不能。在C中,具有可变参数的函数在它们可以处理的类型中受到限制。整数类型经历默认参数提升,它将大多数或所有整数类型更改为int。这是我可以找到的最佳参考:http://www.eskimo.com/~scs/cclass/int/sx11c.html

如果你绝对需要传递很长时间,你可能会传递指针。

答案 2 :(得分:0)

ISO C仅将枚举数值限制在int范围内。如果需要不适合int的枚举常量,则需要使用特定于编译器的扩展来执行此操作。

更重要的是,如果编译器可以表示您定义的值,则可以自由选择较小的类型。

尝试使用-pedantic选项进行编译,您将收到错误。