2010-03-26 148 views
1

問題:壓倒一切的枚舉基類型

我使用的是大的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編譯器中控制此枚舉的編譯指示。是否有隱藏的編譯指示可用?

回答

4

我知道,很多窗戶頭使用以下命令:

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

什麼是Windows標頭? – vprajan 2010-03-26 09:54:11

+0

某些使用此技術的Windows標頭:'d3d10shader.h','d2d1.h'和' wincodec.h' – 2012-09-17 07:32:45

0

在C++ 11:

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

的Visual Studio 2012和gcc 4.4.6與-std = C++ 0x選項都支持這個(早期版本也可以)