2012-07-09 110 views
2

我以前聽說過,我應該讓編譯器選擇爲枚舉常量分配哪些值,如果我沒有做一些聰明的事情,比如使用值作爲位掩碼。如果我只是使用枚舉值來獲得更加明確的代碼文檔,那麼如果我沒有明確定義所有的值,是否有任何陷入困境的陷阱?我相信價值是按升序分配的。我應該定義第一個值以確保每個連續編譯的值相同嗎?我應該明確定義值我的枚舉常量

回答

4

我認爲這將取決於你使用的類型。

優勢不提供enum初始化:

  • 輕鬆地添加和爲您開發刪除值。
  • 您不會意外地定義兩個具有相同值的標識符。

優勢提供enum初始化:

  • 安全序列化和反序列化的數據。如果您需要將這些值放入文件,網絡套接字等,我會繼續寫下值。
  • 更容易查看值以進行調試。
5

從C99,第6.7.2.2p3:

在枚舉列表中的標識符被聲明爲具有類型int和 可能會出現這樣的被允許的地方常數。具有=的枚舉器將其枚舉常量 定義爲常量表達式的值。如果第一個枚舉數爲 no =,則枚舉常量的值爲0.每個隨後的枚舉數no = 將其枚舉常量定義爲通過 獲得的常量表達式的值,將前一個枚舉常量的值加1。 (統計員與 =的使用會產生枚舉常量與重複在同一 枚舉其他值的值。)

需要分配一個值到第一個枚舉的唯一情況是,如果你想它的價值與0不同。通常情況下,你不會這樣做,因爲枚舉器通常用於索引數組。

下面是一個簡單的「將1加到前一個值」的例子。

enum { 
    A, 
    B, 
    C = 0, 
    D, 
    E 
}; 

int main() 
{ 
    printf("%d\n", A); 
    printf("%d\n", B); 
    printf("%d\n", C); 
    printf("%d\n", D); 
    printf("%d\n", E); 
    return 0; 
} 

的輸出上面的程序是:

唯一的「疑難雜症」,我能想到的是,如果你想多enum名錶示相同的值,你要記得或者將它們粘在您別名的項目旁邊,或者放在enum列表的底部。我更喜歡後者,所以我可以計算enum行來預測enum值是什麼。

enum { 
    A, 
    B, 
    E, 

    /* aliases below */ 
    C = A, 
    D = B 
}; 

否則,枚舉器就像int文字一樣。

+0

好的,但用你的最後一句:不,它不是'const int'。它不是一個對象,沒有地址,並且是一個編譯時常量整型表達式。 – 2012-07-09 16:24:39

+0

@JensGustedt:'const int'來自於我引用的標準段落,它所說的「類型爲」int「的常量」,但你說得對,我誤解了它。我編輯了句子,問候 – jxh 2012-07-09 16:29:42

相關問題