問題:壓倒一切的枚舉基類型
我使用的是大的C/C++代碼庫,其上的gcc &視覺工作室的編譯器,其中枚舉基類型是默認的32位(整數工作類型)。
該代碼還有很多內聯+嵌入式程序集,它將枚舉視爲整數類型,枚舉數據在許多情況下用作32位標誌。
當使用realview ARM RVCT 2.2編譯器編譯此代碼時,由於realview編譯器根據enum設置的值自動決定enum基本類型,所以我們開始遇到許多問題。 http://www.keil.com/support/man/docs/armccref/armccref_Babjddhe.htm
例如,
考慮下面枚舉,
enum Scale {
TimesOne, //0
TimesTwo, //1
TimesFour, //2
TimesEight, //3
};
這個枚舉被用作一個32位的標誌。但編譯器將其優化爲此枚舉的無符號字符類型。
使用--enum_is_int編譯器選項對我們的情況來說不是一個好的解決方案,因爲它將所有枚舉轉換爲32位,這將破壞與不使用--enum_is_int編譯的任何外部代碼的交互。
這是警告我在RVCT編譯器發現&庫指南,
的--enum_is_int選項不建議 用於一般用途,不供ISO兼容源所需 。 使用此選項編譯的代碼不是 ,符合ARM 體系結構(基本標準)[BSABI], 的ABI,不正確的使用可能導致運行時發生故障 。該選項不是由C++庫支持的 。
問題
如何枚舉所有的基本類型(由手工編碼的變化)使用32位,而不會影響價值排序轉換?
enum Scale {
TimesOne=0x00000000,
TimesTwo, // 0x00000001
TimesFour, // 0x00000002
TimesEight, //0x00000003
};
我試過上面的改變。但編譯器優化這也爲我們的厄運。 :(
有.NET中的一些語法像
枚舉規模:詮釋
這是一個ISO C++標準和ARM編譯缺乏它
有沒有#?用於在ARM RVCT 2.2編譯器中控制此枚舉的編譯指示。是否有隱藏的編譯指示可用?
什麼是Windows標頭? – vprajan 2010-03-26 09:54:11
某些使用此技術的Windows標頭:'d3d10shader.h','d2d1.h'和' wincodec.h' – 2012-09-17 07:32:45