强制枚举为unsigned long类型

时间:2011-02-22 22:03:27

标签: c++ enums types

是否可以强制枚举的基础类型为unsigned long类型?感谢

3 个答案:

答案 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)编译器:

  • mipsel-openwrt-linux-uclibc-gcc.bin(OpenWrt / Linaro GCC 4.8-2014.04 r47072)4.8.3
  • g ++(Ubuntu 5.4.0-6ubuntu1~16.04.4)5.4.0 20160609
  • gcc(Ubuntu 5.4.0-6ubuntu1~16.04.4)5.4.0 20160609
  • avr-g ++。exe(AVR_8_bit_GNU_Toolchain_3.5.4_1709)4.9.2

通过将一个枚举定义为一个以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