2012-08-03 83 views
1

鑑於宣稱,像這樣的enum編譯器支持枚舉值

enum { 
    A, 
    B, 
    C, 
    D 
}; 

什麼是一般的編譯器支持參考§在C++ 11標準的7.2?具體來說,本節摘自第7.2.2節:

如果第一個枚舉數沒有初始值設定項,則對應常量的值爲零。沒有 初始值設定項的枚舉數定義爲枚舉數提供了通過將前一個枚舉數的 值增加1而獲得的值。

我能想到的普遍,現代的編譯器(GCC,英特爾,鐺,近期CL的版本,別人),給予同樣的結果,那就是,A = 0B = 1C = 2,並D = 3

+3

我會比詹姆斯走得更遠一點。如果編譯器不能正確實現這一點,*拍攝*。擔心這一點就像擔心你的編譯器是否正確執行'switch'一樣。 – 2012-08-03 04:57:04

+0

@NicolBolas酷,這就是我想知道的。 – Anthony 2012-08-03 04:58:16

回答

6

你引用的規則是不是新的在C++ 11。它是C++ 03,C++ 98,C11,C99和C89的一部分。這條規則在之前存在,這些語言都是標準化的。 Java和C#都通過它們的枚舉繼承了這種行爲。

是的,編譯器支持部分的此語言。就像他們支持if,switch,#define,ints和其他基本語言結構

我們不是在談論r值引用或lambda或什麼的。這是許多程序員今天甚至出生之前的核心內容。

+0

謝謝。我認爲檢查總是很好的。這不會是我第一次對一個非常好的編譯器的一個奇怪的不兼容的怪癖感到驚訝。 – Anthony 2012-08-03 05:03:29

+0

大致在這個區域中,我確實在K&R的原始編譯器中發現了一個錯誤,但只有當您在最後一個'}'之前的表達式中嘗試使用這些值時纔會發現錯誤。但那是1989年以前的編譯器,所以我不能認爲它違反了標準。 – MSalters 2012-08-03 08:06:10

3

是的,如果編譯器支持標準。

enum { a, b, c=0 }; 
enum { d, e, f=e+2 }; 

限定acd爲零,be爲1,和f爲3。

+0

是的,我想這就是問題所在。這些編譯器是否支持這個標準的*部分? – Anthony 2012-08-03 04:54:43

+0

@ anthony-arnold是的。例如, – 2012-08-03 04:55:11

+0

+1,我以前從未見過這些情況。 – 2012-08-03 04:55:43