繁体   English   中英

使用pragma或代码更改覆盖枚举基类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM