问题:
我正在使用大型 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 编译器和库指南中找到的警告,
The --enum_is_int option is not recommended for general use and is not required for ISO-compatible source. Code compiled with this option is not compliant with the ABI for the ARM Architecture (base standard) [BSABI], and incorrect use might result in a failure at runtime. This option is not supported by the C++ libraries.
问题
如何在不影响值排序的情况下将所有枚举的基类型(通过手动编码更改)转换为使用 32 位?
enum Scale {
TimesOne=0x00000000,
TimesTwo, // 0x00000001
TimesFour, // 0x00000002
TimesEight, //0x00000003
};
我尝试了上述更改。但是编译器也为我们的坏运气优化了这一点。 :(
.NET 中有一些语法,例如
enum Scale: int
这是 ISO C++ 标准而 ARM 编译器缺少它吗?
在 ARM RVCT 2.2 编译器中没有#pragma 来控制这个枚举。是否有可用的隐藏编译指示?
最佳答案
我知道很多 Windows header 都使用以下内容:
enum SOME_ENUM {
ONE = 1,
TWO = 2,
//...
FORCE_DWORD = 0x7FFFFFFF
};
关于c++ - 使用 pragma 或代码更改覆盖枚举基类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2521200/