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