【问题标题】:Forcing enum to be of unsigned long type强制枚举为无符号长类型
【发布时间】:2011-07-02 08:32:52
【问题描述】:

是否可以强制枚举的底层类型为无符号长类型?谢谢

【问题讨论】:

  • 为什么要强制底层类型为ulong?对于您真正想做的事情,可能有更好的解决方案。
  • 我看到 directX 总是坚持一些大值作为最后一个值......我认为这是强制枚举的长度,但不确定强制它无符号

标签: c++ enums types


【解决方案1】:

在 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() 应用于底层类型。

这是一个相当宽松的条件,它表示您不仅不一定知道类型,而且由于它是实现定义的,因此根本无法保证它甚至对应于一种原始类型。

【讨论】:

    【解决方案2】:

    从 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

    【讨论】:

      【解决方案3】:

      这可以根据您的编译器来实现。 它不适用于 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;
      }
      

      【讨论】:

        猜你喜欢
        • 2012-09-16
        • 1970-01-01
        • 1970-01-01
        • 2014-09-30
        • 2016-01-17
        • 1970-01-01
        • 1970-01-01
        • 2013-02-04
        • 1970-01-01
        相关资源
        最近更新 更多