3

有人可以解释为什么成员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

4

3 回答 3

4

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

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

第 3 段还说:

枚举器列表中的标识符被声明为具有类型的常量,int并且可以出现在任何允许的地方。

第 4 段说:

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

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

于 2013-07-25T11:34:14.253 回答
1

听起来您真正的问题是将 long long 参数传递给具有可变参数的函数:

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

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

如果你绝对需要传递一个 long long,你可能会传递一个指向它的指针。

于 2013-07-25T11:57:07.370 回答
0

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

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

尝试用-pedantic选项编译,你会得到错误。

于 2013-07-25T12:22:59.090 回答