1

问题:

我正在使用一个大型 C/C++ 代码库,它适用于 gcc 和 Visual Studio 编译器,其中枚举基本类型默认为 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 位标志。但编译器将此枚举优化为 unsigned char 类型。

使用 --enum_is_int 编译器选项对我们的情况来说不是一个好的解决方案,因为它将所有枚举转换为 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 中有一些语法,例如

枚举比例:int

这是一个 ISO C++ 标准而 ARM 编译器缺少它吗?

在 ARM RVCT 2.2 编译器中没有 #pragma 来控制此枚举。是否有任何隐藏的编译指示可用?

4

2 回答 2

4

我知道很多 Windows 标头使用以下内容:

enum SOME_ENUM {
    ONE = 1,
    TWO = 2,
    //...
    FORCE_DWORD = 0x7FFFFFFF
};
于 2010-03-26T04:55:38.593 回答
0

在 C++11 中:

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

带有 -std=c++0x 选项的 Visual Studio 2012 和 gcc 4.4.6 都支持此功能(早期版本也可以。)

于 2013-02-25T21:40:09.770 回答