有人可以解释为什么成员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
的函数时,如何处理它?
答案 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) == 8
和sizeof((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
选项进行编译,您将收到错误。