- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有人可以解释为什么成员 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
的函数时,您如何处理它?
最佳答案
您期望的行为对于 C++ 是正确的,但不是 C。C 不允许非 int
枚举器。来自 N1570 (~C11) §6.7.2.2/2:
The expression that defines the value of an enumeration constant shall be an integer constant expression that has a value representable as an
int
.
第 3 段还说:
The identifiers in an enumerator list are declared as constants that have type
int
and may appear wherever such are permitted.
第 4 段说:
Each enumerated type shall be compatible with char, a signed integer type, or an unsigned integer type. The choice of type is implementation-defined
sizeof X == sizeof(int)
是 para 3 的结果,大概 sizeof M == 4
也是出于同样的原因。该实现显然为枚举类型选择了 64 位整数类型,因此 sizeof(enum e_x) == 8
和 sizeof((enum e_x)X)) == 8
关于c - 枚举大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17856681/
我是一名优秀的程序员,十分优秀!