如何更改枚举(C++)使用的整数类型

How to change the integer type used by an enum (C++)?

本文关键字:整数 类型 何更改 枚举 C++      更新时间:2023-10-16

如果我有C++枚举:

enum Foo
{
  Bar,
  Baz,
  Bork,
};

如何告诉编译器使用uint16_t来实际存储枚举的值?

编辑:GCC在C++11的实现中支持这个功能吗?

在C++98/03中无法执行此操作。C++11确实允许你这样做,并且没有enum class,就像其他人一直告诉你的那样:

enum EnumType : uint16_t
{
  Bar,
  Baz,
  Bork,
};

同样,您不必使用enum class。并不是说这是个坏主意,但你不需要。


GCC在实现C++11时是否支持此功能?

GCC的哪个版本?看起来GCC 4.4添加了这个功能,但为了稳定起见,您可能应该查看更新的版本。

在C++11中,您可以执行以下操作:

enum class Foo : uint16_t 
{
  Bar,
  Baz,
  Bork,
};

稍后,您还可以知道枚举的底层类型为:

#include <type_traits> 
std::underlying_type<Foo>::type v = 10; //v is uint16_t

有了c++11,现在就有了enum class,可以显式设置底层类型:

enum class Foo: uint16_t 
{ 
   Bar,
   Baz,
   Bork,
}; 

对于C++2011之前的版本,您可以通过使用合适的值范围来强制实现最小存储:

enum foo {
    v0 = 0,
    vmax = 32767
};

我认为编译器可以自由地选择有符号或无符号整数类型作为基础类型。上述范围强制表示至少使用short作为其基础整数。使其更大可能会导致它使用long。当然,这只是强制一个最小的范围,编译器可以自由选择一个更大的范围。此外,根据上述定义,您不允许偏离范围[0, 32767]:如果您确实需要16位范围(至少),则需要使用相应的值)。