题
<强>问题:强>
我使用的是大的C / C ++代码基地上的gcc&视觉工作室的编译器,其中枚举基类型是默认的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编译的任何外部代码的交互。
此警告i的RVCT编译器和库导向发现,
在--enum_is_int选项不可 推荐用于一般用途,而不是 需要ISO兼容源。 这个选项编译的代码是不是 符合ABI的为ARM 体系结构(基本标准)[BSABI] 和不正确使用可能会导致 故障在运行时。此选项不可 由C ++库支持。
<强>问题强>
如何枚举所有的基本类型转换(由手工编码的改变),以使用32位,而不会影响值排序?
enum Scale {
TimesOne=0x00000000,
TimesTwo, // 0x00000001
TimesFour, // 0x00000002
TimesEight, //0x00000003
};
我试图上述变化。但是,编译器优化,这也为我们的运气不好。 :(
有在.NET一些语法等
枚举规模:INT
这是一个ISO C ++标准和ARM编译缺乏它?
没有对应的#pragma来控制这个在枚举ARM RVCT 2.2编译器。是否有任何隐藏编译可用?
解决方案
我知道很多窗口标题的使用下面的:
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
};
的Visual Studio 2012和gcc 4.4.6与-std =的C ++ 0x选项都支持这个(早期版本可以为好。)