c ++枚举的基础类型是什么?

时间:2009-07-13 21:13:02

标签: c++ enums size types hex

这可能已在其他地方得到解答,但我找不到合适的回应。

我有这段代码:

enum enumWizardPage
{
    WP_NONE = 0x00,  
    WP_CMDID = 0x01,    
    WP_LEAGUES = 0x02,  
    WP_TEAMS = 0x04,    
    WP_COMP = 0x08, 
    WP_DIVISIONS = 0x10,
    WP_FORMULAS = 0x20, 
    WP_FINISHED = 0x40, 
};

哪些是遗产,我必须通过添加一些新值来修改它。 问题是每个值必须是唯一的位,因此可以将它们组合成位图。

使用#x ##十六进制格式设置值,但我想知道这是否是它可以存储的最大值? 如果我将代码更改为

,会产生什么影响(如果有的话)
enum enumWizardPage
{
    WP_NONE = 0x0000,  
    WP_CMDID = 0x0001,  
    WP_LEAGUES = 0x0002,    
    WP_TEAMS = 0x0004,  
    WP_COMP = 0x0008,   
    WP_DIVISIONS = 0x0010,
    WP_FORMULAS = 0x0020,   
    WP_FINISHED = 0x0040,   
};

3 个答案:

答案 0 :(得分:41)

C ++枚举的类型是枚举本身。它的范围相当随意,但实际上,它的基础类型是int

但无论在哪里使用它都会隐式转换为int

C ++ 11更改

自从引入类型枚举的C ++ 11以来,这已经发生了变化。现在,无类型enum被定义为至少int的宽度(如果需要更大的值,则更宽)。但是,如果键入的enum定义如下:

enum name : type {};

类型name的枚举的基础类型为type。例如,enum : char定义的enum宽度与char相同,而不是int

此外,enum可以明确确定范围如下:

enum class name : type {
    value = 0,
    // ...
};

(其中name是必需的,但type是可选的。)以这种方式声明的enum将不再隐式地强制转换为其基础类型(需要static_cast<>)必须使用完全限定名称引用值和值。在此示例中,要将value分配给enum变量,您必须将其称为name::value

答案 1 :(得分:38)

来自N4659 C++ 7.2/5

  

对于其基础类型未修复的枚举,基础类型是一个整数类型,可以表示枚举中定义的所有枚举器值。如果没有整数类型可以表示所有枚举器值,则枚举是不正确的。它是实现定义的,使用整数类型作为基础类型,除了基础类型不应大于int,除非枚举器的值不适合intunsigned int 。如果枚举器列表为空,则基础类型就好像枚举具有值为0的单个枚举器。

答案 2 :(得分:1)

IIRC在内存中表示为int。但是如果需要节省空间,gcc会切换-fshort-enum以使其成为适合所有值的最短整数类型。其他编译器会有类似的东西。