Enum Size*在实践中*

Tun*_*ble 6 c++

对于2011年之前的C++,该标准表示枚举可以是任何大小,从字节到长.但实际上,大多数编译器似乎都会使用4个字节.

那么,在实践中,任何模糊的当前编译器都不会使它们成为整体?

我似乎需要澄清我没有做任何奇怪的事情,比如枚举> 2 ^ 31.只是简单的枚举.在32位或64位系统上,我的软件不能以16位运行!

Bat*_*eba 7

如果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提供了这个.


Vad*_*Key 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;
}
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.

  • @sleeptightpupper的问题是"那么,在实践中,任何模糊的当前编译器都没有使它们成为整体?"......只有一种方法可以回答练习题,检查它.你是对的,msvc不符合标准.但这是生活,开发商必须采用它. (2认同)