2012-11-02 57 views
7

在編譯時可以獲得枚舉成員的值嗎?在編譯時可以獲得枚舉成員的值嗎?

事實上,我希望能夠做這樣的事情:

enum { 
    FOO_FIRST = -1, 
    FOO_A, 
    FOO_B, 
    FOO_C, 
    FOO_LAST 
}; 

#if FOO_LAST > 10 
//... 
#else 
//.. 
#endif 

我知道cpp不知道的變量,語法錯誤等;只有以#(右)開頭的東西?但枚舉的成員具有固定大小,不能像10(常量整數)值一樣更改,編譯器知道它的大小和值。那麼,是否沒有可能做這樣的比較(就像我上面所做的那樣)? gcc-extensions也非常讚賞。

這只是一個嘗試,不要用#define s來重寫我所有的枚舉,也不要花時間去做一些宏的改變。

+1

你在'#if'塊中想要做什麼? – ecatmur

+0

不能想到任何實際的用例,這是有用的.. –

+0

[enum和#define](http://stackoverflow.com/questions/136946/difference-between-enum-and-define-statements) – SparKot

回答

7

只需使用if。枚舉可以在編譯時進行評估。編譯器將優化不可能分支出來:

if (FOO_LAST > 10) { 
    // A 
} else { 
    // B 
} 

編譯器知道其兩個分支(A和B)的無法到達,所以可以完全消除if

但是請注意,您應該直接使用枚舉器。例如,在此:

​​

GCC將保持if比較。

+0

非常好。我會嘗試一下。你有這樣的優化細節的鏈接? (我們正在談論的gcc?) – Jack

+1

看到這個想法:http://stackoverflow.com/questions/11281471/disable-if0-elimination-in-gcc你甚至不必讓優化器得到這個行爲。用'-O2 -S'編譯一個示例程序來獲取程序集文件。你會看到沒有分支。 –

+0

非常感謝。你拯救了我的一天。 :) – Jack

3

#ifdef由預處理器解釋而不是由編譯器解釋。預處理器不知道任何有關enums的值。所以這不是一種方法。