如何更改枚举(C+;+;)使用的整数类型? 如果我有C++枚举: enum Foo { Bar, Baz, Bork, };

如何更改枚举(C+;+;)使用的整数类型? 如果我有C++枚举: enum Foo { Bar, Baz, Bork, };,c++,c,enums,C++,C,Enums,如何告诉编译器使用uint16\u t来实际存储枚举值 编辑:GCC在其C++11的实现中是否支持此功能?使用您现在拥有的C++11,它允许您显式设置底层类型: enum class Foo: uint16_t { Bar, Baz, Bork, }; 在C++11中,可以执行以下操作: enum class Foo : uint16_t { Bar, Baz, Bork, }; 稍后,您还可以: #包括 标准::基本类型::类型v=10//v是uint

如何告诉编译器使用
uint16\u t
来实际存储枚举值


编辑:GCC在其C++11的实现中是否支持此功能?

使用您现在拥有的
C++11
,它允许您显式设置底层类型:

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

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

enum class Foo : uint16_t 
{
  Bar,
  Baz,
  Bork,
};
稍后,您还可以:

#包括
标准::基本类型::类型v=10//v是uint16\u t

在C++98/03中无法执行此操作。C++11确实允许您这样做,而且不需要像其他人一直告诉您的那样
enum类

enum EnumType : uint16_t
{
  Bar,
  Baz,
  Bork,
};
同样,您不必使用
enum类
。并不是说这是个坏主意,但你不必这么做


GCC在其C++11的实现中是否支持此功能


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

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

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

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

@YochaiTimmer,标准已更改,链接上的主题没有说明
枚举类
@YochaiTimmer:根本没有。我想知道是否可以将enum更改为使用
uint16\u t
在内部存储其值,而不是它是否与
int
大小相同。我自己也在想这一点。唯一的区别是
enum class
创建了一个新的作用域,而
enum
没有。@chris:没有,
enum class
enum
之间有几个区别。两者都创建作用域(可以使用
EnumType::Bar
访问上面的
Bar
),但只有
class
版本强制您使用作用域枚举。另外,
enum类
变量不会隐式地将整数转换为枚举类型。因此,您必须传递正确类型的实际枚举数,或者必须执行显式强制转换。这增加了更多的类型安全性。哦,我从另一个问题中得到了我的观点,所以:至于你的第二点,我只是从来没有听说过。感谢您提供的免费知识:)实际上,底层类型的大小也有限制。[dcl.enum]/6精度:基础类型不得大于
int
,除非枚举数的值不能放入
int
无符号int
中。
enum foo {
    v0 = 0,
    vmax = 32767
};