我以前聽說過,我應該讓編譯器選擇爲枚舉常量分配哪些值,如果我沒有做一些聰明的事情,比如使用值作爲位掩碼。如果我只是使用枚舉值來獲得更加明確的代碼文檔,那麼如果我沒有明確定義所有的值,是否有任何陷入困境的陷阱?我相信價值是按升序分配的。我應該定義第一個值以確保每個連續編譯的值相同嗎?我應該明確定義值我的枚舉常量
2
A
回答
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
文字一樣。
相關問題
- 1. 我應該在哪裏定義枚舉?
- 2. 我是否應該明確指定超類和Swift中枚舉的起始值
- 3. 應該將映射值聲明爲常量還是枚舉?
- 4. 我應該在哪裏定義我的枚舉?
- 5. 聲明常量枚舉
- 6. 我應該如何格式化我的.txt枚舉值?
- 7. 我應該定義自定義的枚舉器還是使用內置的枚舉器?
- 8. 枚舉聲明和定義
- 9. 定義枚舉常量身體JCodeModel
- 10. 應該在哪裏定義枚舉?
- 11. 接口是否應該定義實現特定的枚舉值?
- 12. Java自定義枚舉值枚舉
- 13. 我不明白PlatformID枚舉
- 14. 這EntitySetRights枚舉我應該使用
- 15. WCF客戶端在明確定義枚舉值時失敗
- 16. 枚舉常量
- 17. 爲什麼我應該在頂層聲明枚舉?
- 18. 我應該將枚舉ID /值存儲在數據庫還是C#枚舉中?
- 19. 我應該用在那裏,我需要他們的內在價值枚舉或只是單獨的常量
- 20. 我應該明確trunc?
- 21. PHP未定義的變量,應該明確定義
- 22. 枚舉與該枚舉值賦給
- 23. 我應該重寫Enum.toString()來定位一個枚舉的標籤?
- 24. ngGrid單元格值是一個枚舉值,我該如何使用枚舉名?
- 25. 枚舉和常量
- 26. 我應該將參考表值作爲枚舉存儲嗎?
- 27. 我在一個枚舉變量中設置三個枚舉常量,有沒有辦法從枚舉變量中檢索枚舉常量作爲數組?
- 28. 我應該明確地宣佈我的變量在VB6
- 29. 我應該創建traits來表示我的模型的枚舉值嗎?
- 30. 個人枚舉定義功能常數我班
好的,但用你的最後一句:不,它不是'const int'。它不是一個對象,沒有地址,並且是一個編譯時常量整型表達式。 – 2012-07-09 16:24:39
@JensGustedt:'const int'來自於我引用的標準段落,它所說的「類型爲」int「的常量」,但你說得對,我誤解了它。我編輯了句子,問候 – jxh 2012-07-09 16:29:42