代码之家  ›  专栏  ›  技术社区  ›  vprajan

使用pragma或代码更改重写枚举基类型

  •  1
  • vprajan  · 技术社区  · 15 年前

    问题:

    我使用的是一个大的C/C++代码库,它在GCC和VisualStudio编译器上工作,其中EnUM基类型默认为32位(整型)。

    此代码还具有许多内联+嵌入式程序集,它们将枚举视为整数类型,并且在许多情况下,枚举数据用作32位标志。

    当使用realview arm rvct 2.2编译器编译此代码时,我们开始遇到许多问题,因为realview编译器根据枚举设置的值自动确定枚举基类型。 http://www.keil.com/support/man/docs/armccref/armccref_Babjddhe.htm

    例如,

    考虑下面的枚举,

    enum Scale {
        TimesOne, //0
        TimesTwo, //1
        TimesFour, //2
        TimesEight, //3
    };
    

    此枚举用作32位标志。但编译器将其优化为该枚举的无符号字符类型。

    对于我们来说,使用--enum_is_int compiler选项不是一个好的解决方案,因为它将所有枚举转换为32位,这将中断与未使用--enum_is_int编译的任何外部代码的交互。

    这是我在《RVCT编译器库指南》中发现的警告,

    --enum_is_int选项不是 建议用于一般用途,而不是 对于ISO兼容源是必需的。 使用此选项编译的代码不是 符合ARM的ABI 建筑(基本标准)【BSABI】, 不正确的使用可能导致 运行时失败。此选项不是 由C++库支持。

    问题

    如何在不影响值排序的情况下将所有枚举的基类型(通过手工编码的更改)转换为使用32位?

    enum Scale {
        TimesOne=0x00000000,
        TimesTwo, // 0x00000001
        TimesFour, // 0x00000002
        TimesEight, //0x00000003
    };
    

    我试过上面的改变。但编译器优化这一点也是为了我们的坏运气。:(

    在.NET中有一些类似的语法

    枚举量表

    这是ISO C++标准,ARM编译器缺少吗?

    arm rvct 2.2编译器中没有pragma来控制此枚举。是否有隐藏的pragma可用?

    2 回复  |  直到 12 年前
        1
  •  4
  •   Dean Harding    15 年前

    我知道许多Windows头文件都使用以下内容:

    enum SOME_ENUM {
        ONE = 1,
        TWO = 2,
        //...
        FORCE_DWORD = 0x7FFFFFFF
    };
    
        2
  •  0
  •   Dale Wilson    12 年前

    在C++ 11中:

    enum class Scale : uint32_t {
       TimesOne, //0
       TimesTwo, //1
       TimesFour, //2
       TimesEight, //3
    };
    

    VisualStudio 2012和GCC 4.4.6中的-STD= C++0x选项都支持这一点(早期版本也可以)。