这可能已在其他地方得到解答,但我找不到合适的答案。
我有这个代码:
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,
};
对于其基础类型未修复的枚举,基础类型是一个整数类型,可以表示枚举中定义的所有枚举器值。如果没有整数类型可以表示所有枚举器值,则枚举是不正确的。它是实现定义的,使用整数类型作为基础类型,除了基础类型不应大于
int
,除非枚举器的值不能适合int
或unsigned int
。如果枚举器列表为空,则基础类型就好像枚举具有值为0的单个枚举器一样。
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
。
IIRC在内存中表示为int。但是如果需要节省空间,gcc会切换-fshort-enum
以使其成为适合所有值的最短整数类型。其他编译器会有类似的东西。