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

Cod*_*ile 37 c++ size enums hex types

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

我有这个代码:

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, 
};
Run Code Online (Sandbox Code Playgroud)

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

这些值是使用#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,   
};
Run Code Online (Sandbox Code Playgroud)

gre*_*ade 45

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

不过,它被隐式地投射到了int它所使用的任何地方.

C++ 11的变化

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

enum name : type {};
Run Code Online (Sandbox Code Playgroud)

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

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

enum class name : type {
    value = 0,
    // ...
};
Run Code Online (Sandbox Code Playgroud)

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


Kir*_*sky 39

从标准C++ 7.2/5:

枚举的基础类型是一个整数类型,可以表示枚举中定义的所有枚举器值.它是实现定义的,其中整数类型用作枚举的基础类型,除了基础类型不应大于int,除非枚举器的值不能适合int或unsigned int.如果枚举器列表为空,则基础类型就好像枚举具有值为0的单个枚举器.应用于枚举类型,枚举类型的对象或枚举器的sizeof()的值是sizeof()的值应用于基础类型.


cub*_*ube 5

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