是否可以强制枚举的基础类型为unsigned long类型?感谢
答案 0 :(得分:28)
在C ++ 03中,没有办法强制枚举类型具有任何特定的底层实现。 C ++规范,§7.2/ 5:
枚举的基础类型是一个整数类型,可以表示枚举中定义的所有枚举器值。它是实现定义的哪个整数类型用作枚举的基础类型,除了基础类型不应大于int,除非枚举器的值不能适合int或unsigned int。如果枚举器列表为空,则基础类型就好像枚举具有值为0的单个枚举器。应用于枚举类型,枚举类型的对象或枚举器的sizeof()的值是sizeof()应用于基础类型。
这是一个非常宽松的条件,并且说你不仅不一定知道类型,而且因为它是实现定义的,所以不能保证它甚至可以对应于一种原始类型。
但是,在C ++ 0x中,他们正在修复此问题,以便您可以明确提及您想要的类型:
enum MyEnumeration: unsigned long {
/* ... values go here ... */
};
这将允许您显式控制基础类型。
答案 1 :(得分:1)
这可以根据您的编译器来实现。 它不适用于Windows MSVS,但我测试了它,它使用了以下版本的gcc / g ++(以及嵌入式cpp)编译器:
通过将一个枚举定义为一个以long值表示的值,在某些编译器中,它会将其强制为该大小。以下代码通常输出:
8
4
4
来源:
#include <iostream>
using namespace std;
typedef enum
{
ENUM_11,
ENUM_12,
enum1_force_long = 0x1122334455667788
} LongEnum1_t;
typedef enum
{
ENUM_21,
ENUM_22,
enum2_force_long = 0x11223344
} LongEnum2_t;
typedef enum
{
ENUM_31,
ENUM_32,
enum3_force_long = 0x1122
} LongEnum3_t;
LongEnum1_t enum1;
LongEnum2_t enum2;
LongEnum3_t enum3;
int main(void)
{
cout << sizeof(enum1) << endl;
cout << sizeof(enum2) << endl;
cout << sizeof(enum3) << endl;
return 0;
}
答案 2 :(得分:0)
自C ++ 11起,您可以像这样进行enum MyEnum : unsigned long
:
enum Color : int { red, green, blue };
Color r = red;
switch(r)
{
case red : std::cout << "red\n"; break;
case green: std::cout << "green\n"; break;
case blue : std::cout << "blue\n"; break;
}
参考:here