[英]overriding enumeration base type using pragma or code change
问题:
我正在使用一个大的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兼容源不需要.enum_is_int选项。 使用此选项编译的代码不符合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来控制此枚举。 有没有隐藏的pragma?
我知道很多windows标头使用以下内容:
enum SOME_ENUM {
ONE = 1,
TWO = 2,
//...
FORCE_DWORD = 0x7FFFFFFF
};
在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都支持此功能(早期版本也可以。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.