<强>问题:

我使用的是大的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选项都支持这个(早期版本可以为好。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top