问题:
我正在使用一个大型 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 来控制此枚举。是否有任何隐藏的编译指示可用?