c++ 枚举的底层类型是啥?

Posted

技术标签:

【中文标题】c++ 枚举的底层类型是啥?【英文标题】:What is the underlying type of a c++ enum?c++ 枚举的底层类型是什么? 【发布时间】:2010-11-10 11:04:57 【问题描述】:

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

我有这个代码:

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,   
;

【问题讨论】:

【参考方案1】:

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

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

C++11 变化

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

enum name : type ;

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

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

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

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

【讨论】:

【参考方案2】:

来自N4659 C++ 7.2/5:

对于底层类型不固定的枚举,底层类型是一个整数类型,可以表示枚举中定义的所有枚举值。如果没有整数类型可以表示所有枚举数值,则枚举格式错误。使用哪种整数类型作为基础类型由实现定义,除非基础类型不得大于int,除非枚举数的值不能适合intunsigned int。如果 enumerator-list 为空,则基础类型就好像该枚举有一个值为 0 的枚举数。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于c++ 枚举的底层类型是啥?的主要内容,如果未能解决你的问题,请参考以下文章

枚举名称的用途是啥?

java中的枚举是啥意思?

java中的枚举是啥意思?

java中的枚举类型指的是啥啊?

枚举类型enum用法 c语言switch的用法是啥

从底层类型安全地转换枚举类