2010-03-26 91 views
1

问题:压倒一切的枚举基类型

我使用的是大的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编译器中控制此枚举的编译指示。是否有隐藏的编译指示可用?

回答

4

我知道,很多窗户头使用以下命令:

enum SOME_ENUM { 
    ONE = 1, 
    TWO = 2, 
    //... 
    FORCE_DWORD = 0x7FFFFFFF 
}; 
+0

什么是Windows标头? – vprajan 2010-03-26 09:54:11

+0

某些使用此技术的Windows标头:'d3d10shader.h','d2d1.h'和' wincodec.h' – 2012-09-17 07:32:45

0

在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选项都支持这个(早期版本也可以)