问题:压倒一切的枚举基类型
我使用的是大的C/C++代码库,其上的gcc &视觉工作室的编译器,其中枚举基类型是默认的32位(整数工作类型)。
该代码还有很多内联+嵌入式程序集,它将枚举视为整数类型,枚举数据在许多情况下用作32位标志。
当使用realview ARM RVCT 2.2编译器编译此代码时,由于realview编译器根据enum设置的值自动决定enum基本类型,所以我们开始遇到许多问题。 http://www.keil.com/support/man/docs/armccref/armccref_Babjddhe.htm
例如,
考虑下面枚举,
enum Scale {
TimesOne, //0
TimesTwo, //1
TimesFour, //2
TimesEight, //3
};
这个枚举被用作一个32位的标志。但编译器将其优化为此枚举的无符号字符类型。
使用--enum_is_int编译器选项对我们的情况来说不是一个好的解决方案,因为它将所有枚举转换为32位,这将破坏与不使用--enum_is_int编译的任何外部代码的交互。
这是警告我在RVCT编译器发现&库指南,
的--enum_is_int选项不建议 用于一般用途,不供ISO兼容源所需 。 使用此选项编译的代码不是 ,符合ARM 体系结构(基本标准)[BSABI], 的ABI,不正确的使用可能导致运行时发生故障 。该选项不是由C++库支持的 。
问题
如何枚举所有的基本类型(由手工编码的变化)使用32位,而不会影响价值排序转换?
enum Scale {
TimesOne=0x00000000,
TimesTwo, // 0x00000001
TimesFour, // 0x00000002
TimesEight, //0x00000003
};
我试过上面的改变。但编译器优化这也为我们的厄运。 :(
有.NET中的一些语法像
枚举规模:诠释
这是一个ISO C++标准和ARM编译缺乏它
有没有#?用于在ARM RVCT 2.2编译器中控制此枚举的编译指示。是否有隐藏的编译指示可用?
什么是Windows标头? – vprajan 2010-03-26 09:54:11
某些使用此技术的Windows标头:'d3d10shader.h','d2d1.h'和' wincodec.h' – 2012-09-17 07:32:45