【发布时间】:2017-06-09 18:02:44
【问题描述】:
为什么会这样:
#include <stdio.h>
#include <limits.h>
#include <inttypes.h>
int main() {
enum en_e {
en_e_foo,
en_e_bar = UINT64_MAX,
};
enum en_e e = en_e_foo;
printf("%zu\n", sizeof en_e_foo);
printf("%zu\n", sizeof en_e_bar);
printf("%zu\n", sizeof e);
}
在 C 中打印 4 8 8 并在 C++ 中打印 8 8 8(在具有 4 字节整数的平台上)?
我的印象是 UINT64_MAX 赋值会强制所有枚举常量至少为 64 位,但 en_e_foo 在普通 C 中保持为 32。
差异的原因是什么?
【问题讨论】:
-
哪些编译器?我不知道这是否会有所不同,但它可能会。
-
@MarkRansom 它提出了 gcc 但 clang 的行为相同。
-
“在具有 4 字节整数的平台上” 确定类型宽度的不仅仅是平台,而是编译器。这可能就是一切。 (根据 Keith 的回答,实际上不是,但一般要注意这种可能性)