2012-03-24 66 views
16

如果我有一个C++枚举:如何更改枚举(C++)使用的整数类型?

enum Foo 
{ 
    Bar, 
    Baz, 
    Bork, 
}; 

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

编辑:GCC是否在C++ 11的实现中支持这个特性?

+1

@YochaiTimmer,标准改变了,链接上的主题没有告诉'enum class' – Lol4t0 2012-03-24 17:10:13

+0

@YochaiTimmer:根本没有。我想知道如果我可以改变枚举来存储它的内部值与'uint16_t',而不是它是否与'int'相同的大小。 – Linuxios 2012-03-24 17:14:34

回答

23

你不能在C++ 98/03中做到这一点。 C++ 11确实允许你这样做,并没有enum class每个人的方式抄小路都跟你:

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

同样,你不必使用enum class。不是说这是一个坏主意,但你不到。


GCC是否支持此功能,在其实施的C++ 11?

Which version of GCC?它看起来像GCC 4.4增加了这个功能,但你应该看看更新的版本,只是为了稳定。

+0

我在想我自己。唯一的区别是'enum class'创建一个新的作用域,而'enum'不会。 – chris 2012-03-24 17:26:58

+3

@chris:不,在'enum class'和'enum'之间有几处区别。两者都创建范围(上面的'Bar'可以通过'EnumType :: Bar'访问),但只有'class'版本*强制你使用范围枚举。而且,'enum class'变量不会*将整数转换为枚举类型。因此,您必须传递正确类型的实际枚举数,或者您必须执行明确的投射。这增加了许多类型安全性。 – 2012-03-24 17:30:35

+0

哦,我从另一个问题得到了我的观点:http://stackoverflow.com/questions/441552/scope-resolution-operator-on-enums-a-compiler-specific-extension至于你的第二点,我简单从来没有听说过那个。感谢免费的知识:) – chris 2012-03-24 17:46:39

5

随着c++11你现在有enum class,允许你设定明确的基本类型:

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

在C++ 11,你可以这样做:后来

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

,你可以也know the underlying type of the enum为:

#include <type_traits> 

std::underlying_type<Foo>::type v = 10; //v is uint16_t 
+3

+1用于添加'underlying_type'查询。 – 2012-03-24 19:29:10

5

通过预C++ 2011可以通过使用合适的范围内的值的强制的最小存储:

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

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

+1

实际上,底层类型的大小也有限制。 [dcl.enum]/6 precises:除非枚举器的值不适合int或unsigned int,否则基础类型不应大于“int”。 – 2012-03-24 19:36:28