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

标签 c++ arm enums realview

问题:

我正在使用大型 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 编译器和库指南中找到的警告,

The --enum_is_int option is not recommended for general use and is not required for ISO-compatible source. Code compiled with this option is not compliant with the ABI for the ARM Architecture (base standard) [BSABI], and incorrect use might result in a failure at runtime. This option is not supported by the C++ libraries.

问题

如何在不影响值排序的情况下将所有枚举的基类型(通过手动编码更改)转换为使用 32 位?

enum Scale {
    TimesOne=0x00000000,
    TimesTwo, // 0x00000001
    TimesFour, // 0x00000002
    TimesEight, //0x00000003
};

我尝试了上述更改。但是编译器也为我们的坏运气优化了这一点。 :(

.NET 中有一些语法,例如

enum Scale: int

这是 ISO C++ 标准而 ARM 编译器缺少它吗?

在 ARM RVCT 2.2 编译器中没有#pragma 来控制这个枚举。是否有可用的隐藏编译指示?

最佳答案

我知道很多 Windows header 都使用以下内容:

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

关于c++ - 使用 pragma 或代码更改覆盖枚举基类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2521200/

相关文章:

c++ - C++多线程环境下的内存访问

c# - Enum.GetValues(typeof(....)) 没有返回正确的枚举值

java - 通过 aidl 接口(interface)传递枚举

c - ARM cortex M4 组件闪烁 LED 延迟

cmake 转换为目标文件

c# - 将一些 bool 属性转换为标志枚举

具有结构成员的 C++ union 结构适用于 Clang 和 MSVC,但不适用于 GCC

c++ - 为什么我们选择 "bounding box"方法来填充一个三角形呢?

c++ - 简单 C++ 程序上的过程入口点错误

java - SwingFXUtils 图像序列化替代方案(Javafx、Swing、Raspberry Pi)