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