如果我有一个C++枚举:
enum Foo
{
Bar,
Baz,
Bork,
};
Run Code Online (Sandbox Code Playgroud)
如何告诉编译器使用a uint16_t来实际存储枚举值?
编辑:GCC在C++ 11的实现中是否支持此功能?
Nic*_*las 32
你不能在C++ 98/03中这样做.C++ 11确实允许你这样做,并且没有 enum class其他人似乎一直告诉你的方式:
enum EnumType : uint16_t
{
Bar,
Baz,
Bork,
};
Run Code Online (Sandbox Code Playgroud)
同样,你不必使用enum class.不,这是一个坏主意,但你不具备对.
GCC在C++ 11的实现中是否支持此功能?
哪个版本的GCC?看起来GCC 4.4增加了这个功能,但你应该看看更新版本,只是为了稳定.
Naw*_*waz 17
在C++ 11中,您可以这样做:
enum class Foo : uint16_t
{
Bar,
Baz,
Bork,
};
Run Code Online (Sandbox Code Playgroud)
稍后,您还可以知道枚举的基础类型:
#include <type_traits>
std::underlying_type<Foo>::type v = 10; //v is uint16_t
Run Code Online (Sandbox Code Playgroud)
随着c++11你现在有enum class,它允许你明确地设置基本类型:
enum class Foo: uint16_t
{
Bar,
Baz,
Bork,
};
Run Code Online (Sandbox Code Playgroud)
使用pre-C++ 2011,您可以使用适当的值范围强制实现最小存储:
enum foo {
v0 = 0,
vmax = 32767
};
Run Code Online (Sandbox Code Playgroud)
我认为编译器可以自由选择符号或无符号整数类型作为基础类型.上述范围强制表示至少使用表示short基础整数.使它甚至更大可能会导致它使用long.当然,这只会强制最小范围,编译器可以自由选择更大的范围.此外,根据上述定义,您不允许偏离范围[0, 32767]:如果您确实需要16位范围(至少),则需要使用相应的值).