簡體   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