使用编译指示或代码更改覆盖枚举基类型

发布于 2024-08-26 14:29:02 字数 1401 浏览 3 评论 0原文

问题:

我正在使用一个大型 C/C++ 代码库,它可以在 gcc 和 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 编译器和 RVCT 中发现的警告。图书馆指南,

--enum_is_int 选项不是 推荐用于一般用途,而不是 ISO 兼容源需要。 使用此选项编译的代码不是 符合 ARM 的 ABI 架构(基本标准)[BSABI], 不正确的使用可能会导致 运行时失败。该选项不 由 C++ 库支持。

问题

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

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

我尝试了上面的改变。但编译器对此进行了优化,这也是为了我们的运气不好。 :(

.NET 中有一些语法,例如

枚举范围:整数

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

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

Problem:

I am using a big C/C++ code base which works on gcc & visual studio compilers where enum base type is by default 32-bit(integer type).

This code also has lots of inline + embedded assembly which treats enum as integer type and enum data is used as 32-bit flags in many cases.

When compiled this code with realview ARM RVCT 2.2 compiler, we started getting many issues since realview compiler decides enum base type automatically based on the value an enum is set to. http://www.keil.com/support/man/docs/armccref/armccref_Babjddhe.htm

For example,

Consider the below enum,

enum Scale {
    TimesOne, //0
    TimesTwo, //1
    TimesFour, //2
    TimesEight, //3
};

This enum is used as a 32-bit flag. but compiler optimizes it to unsigned char type for this enum.

Using --enum_is_int compiler option is not a good solution for our case, since it converts all the enum's to 32-bit which will break interaction with any external code compiled without --enum_is_int.

This is warning i found in RVCT compilers & Library guide,

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.

Question

How to convert all enum's base type (by hand-coded changes) to use 32-bit without affecting value ordering?

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

I tried the above change. But compiler optimizes this also for our bad luck. :(

There is some syntax in .NET like

enum Scale: int

Is this a ISO C++ standard and ARM compiler lacks it?

There is no #pragma to control this enum in ARM RVCT 2.2 compiler. Is there any hidden pragma available ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

蓝眼泪 2024-09-02 14:29:02

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

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

I know that a lot of the windows headers use the following:

enum SOME_ENUM {
    ONE = 1,
    TWO = 2,
    //...
    FORCE_DWORD = 0x7FFFFFFF
};
为你鎻心 2024-09-02 14:29:02

在 C++11 中:

enum class Scale : uint32_t {
   TimesOne, //0
   TimesTwo, //1
   TimesFour, //2
   TimesEight, //3
};

Visual Studio 2012 和带有 -std=c++0x 选项的 gcc 4.4.6 都支持此功能(早期版本也可能如此。)

In C++11:

enum class Scale : uint32_t {
   TimesOne, //0
   TimesTwo, //1
   TimesFour, //2
   TimesEight, //3
};

Visual Studio 2012 and gcc 4.4.6 with the -std=c++0x option both support this (earlier versions may as well.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文