这可能已在其他地方得到解答,但我找不到合适的回应。
我有这段代码:
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,
};
答案 0 :(得分:41)
C ++枚举的类型是枚举本身。它的范围相当随意,但实际上,它的基础类型是int
。
但无论在哪里使用它都会隐式转换为int
。
自从引入类型枚举的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)
对于其基础类型未修复的枚举,基础类型是一个整数类型,可以表示枚举中定义的所有枚举器值。如果没有整数类型可以表示所有枚举器值,则枚举是不正确的。它是实现定义的,使用整数类型作为基础类型,除了基础类型不应大于
int
,除非枚举器的值不适合int
或unsigned int
。如果枚举器列表为空,则基础类型就好像枚举具有值为0的单个枚举器。
答案 2 :(得分:1)
IIRC在内存中表示为int。但是如果需要节省空间,gcc会切换-fshort-enum
以使其成为适合所有值的最短整数类型。其他编译器会有类似的东西。