对于2011年之前的C ++,该标准表示枚举可以是任何大小,从字节到长。但在实践中,似乎大多数编译器都将它们整理为4个字节。
那么,在实践中做任何模糊的当前编译器都不会使它们成为整体?
我似乎需要澄清一点,我没有做任何奇怪的事情,比如枚举> 2 ^ 31。只是简单的枚举。在32位或64位系统上,我的软件不会以16位运行!
答案 0 :(得分:7)
如果enum
始终为int
,则以下内容将不安全:
enum oops {
foo = 32767,
bar, /*what am I?*/
};
这是因为int
可以小到16位(这仍然是令人惊讶的常见)。在具有32位int
的系统上,您可以设置foo = 2147483647
,并且您的编译器肯定不会选择int
作为基础类型。
因此,聪明的C ++标准指定底层enum
整数类型必须能够表示给定的值,编译器可以自由选择一个合适的值。鉴于int
通常被认为是机器的本机类型,它通常是明智的选择。
如果您想知道enum
的基础类型,则std::underlying_type会提供此信息。
答案 1 :(得分:7)
让我们在任何现代编译器上看到它:
#include <iostream>
#include <limits>
enum MySmallSmall {
SmallValue = 0,
};
enum MyLongLong {
LongValue = std::numeric_limits<long long>::max()
};
int main() {
std::cout << "sizeof MySmallSmall is " << sizeof(MySmallSmall) << std::endl;
std::cout << "sizeof MyLongLong is " << sizeof(MyLongLong) << std::endl;
return 0;
}
clang和g ++输出:
sizeof MySmallSmall是4
sizeof MyLongLong是8
但是对于MS Visual Studio,两个结果都是4(我已经使用这个网站http://rextester.com/l/cpp_online_compiler_visual检查了它,不知道这里有什么编译器版本)
所以你不能依赖任何枚举的sizeof。