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
,除非枚举数的值不能适合int
或unsigned int
。如果 enumerator-list 为空,则基础类型就好像该枚举有一个值为 0 的枚举数。
【讨论】:
【参考方案3】:IIRC 在内存中表示为 int。但是 gcc 有开关 -fshort-enum
使其成为适合所有值的最短整数类型,如果您需要节省空间。其他编译器也会有类似的东西。
【讨论】:
以上是关于c++ 枚举的底层类型是啥?的主要内容,如果未能解决你的问题,请参考以下文章