此聲明:
enum fruit {
apple,
orange
};
宣佈三件事情:一個名爲enum fruit
型和兩個枚舉稱爲apple
和orange
。
enum fruit
實際上是一個不同的類型。它與一些實現定義的整數類型兼容;例如,enum fruit
可能與int
,char
兼容,或者甚至與unsigned long long
兼容,只要選擇的類型可以表示所有值。
另一方面,統計員是int
類型的常量。事實上,有利用裸enum
聲明中聲明int
常量的常見的伎倆,而無需使用預處理:
enum { MAX = 1000 };
是的,這意味着恆apple
,即使它被宣佈爲enum fruit
定義的一部分,實際上不是enum fruit
類型。原因是歷史的。是的,它可能更有意義的是,統計員是這種類型的常量。
實際上,這種不一致性很少。在大多數情況下,離散類型(即整數和枚舉類型)在很大程度上是可以互換的,而隱式轉換通常是正確的。
enum fruit { apple, orange };
enum fruit obj; /* obj is of type enum fruit */
obj = orange; /* orange is of type int; it's
implicitly converted to enum fruit */
if (obj == orange) { /* operands are converted to a common type */
/* ... */
}
但結果是,正如你所看到的,編譯器是不太可能,如果你使用一個枚舉類型有關的常數警告你的意思是使用不同的一個。
一種方式來獲得強大的類型檢查是包裝在一個結構數據:
enum fruit { /* ... */ };
enum color { /* ... */ };
struct fruit { enum fruit f; };
struct color { enum color c; };
struct fruit
和struct color
是不同的和不兼容的類型之間沒有隱式(或顯式)的轉換。缺點是你必須明確地參考.f
或.c
成員。 (大多數C程序員只是指望他們有能力把事情放在第一位 - 結果好壞參半。)
(typedef
不會爲您提供強類型檢查;儘管名稱爲名稱創建了別名類型,而不是一個新的類型。)
(在C++的規則略有不同。)
所有冰雹蘋果/ LLVM。我相信這3個編譯器幾乎涵蓋了所有主要的操作系統(iOS,Android,Microsoft,OSX),但是還有其他有趣的更新。我相信以前的帖子提到icc,但我沒有訪問。 – 2015-02-12 17:57:02