【发布时间】:2011-07-02 08:32:52
【问题描述】:
是否可以强制枚举的底层类型为无符号长类型?谢谢
【问题讨论】:
-
为什么要强制底层类型为ulong?对于您真正想做的事情,可能有更好的解决方案。
-
我看到 directX 总是坚持一些大值作为最后一个值......我认为这是强制枚举的长度,但不确定强制它无符号
是否可以强制枚举的底层类型为无符号长类型?谢谢
【问题讨论】:
在 C++11 及更高版本中,您可以明确提及您想要的类型:
enum MyEnumeration: unsigned long {
/* ... values go here ... */
};
这将允许您显式控制基础类型。
在 C++03 中,无法强制枚举类型具有任何特定的底层实现。引用 C++03 规范,§7.2/5:
枚举的底层类型是一个整数类型,可以表示枚举中定义的所有枚举值。 实现定义了将哪种整数类型用作枚举的基础类型,除非基础类型不得大于 int,除非枚举数的值不能适合 int 或 unsigned int。如果 enumerator-list 为空,则底层类型就好像该枚举具有一个值为 0 的单个枚举器。应用于枚举类型、枚举类型的对象或枚举器的 sizeof() 的值是sizeof() 应用于底层类型。
这是一个相当宽松的条件,它表示您不仅不一定知道类型,而且由于它是实现定义的,因此根本无法保证它甚至对应于一种原始类型。
【讨论】:
从 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
【讨论】:
这可以根据您的编译器来实现。 它不适用于 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;
}
【讨论】: