2016-02-13 50 views
2

enum元素的名稱是易受重疊/碰撞與兩個其他枚舉元素名,變量名等...避免名稱衝突,在C(C99)枚舉

enum Fruit 
{ 
    apple, 
    orange 
}; 
typedef enum Fruit Fruit; 


enum Color 
{ 
    red, 
    orange // <-- ERROR 
}; 
typedef enum Color Color; 


char apple='a'; // <-- ERROR 

是否有一個兼容的C99溶液避免每個枚舉元素名稱的前綴之外的衝突?


旁註:這個問題已經回答了C++

How to avoid name conflicts for two enum values with the same name in C++?

我正在尋找一個解決方案C99。

+0

是的,使用一個合適的名稱,比如'color_orange'和'fruit_orange'。閱讀時也應避免混淆。 –

+0

除了爲每個枚舉元素名稱添加**之外,是否還有解決方案**? – Paolo

+0

也許,但它可能是一個不好的解決方案,這是一個很好的解決方案,也有助於可讀性。 –

回答

4

在C中,除了爲枚舉值的名稱加上前綴之外,沒有其他解決方案。如OP中所指出的,C++有許多機制,其中enum class可能是現代代碼所指示的。但是,實際上結果是一樣的:您最終將enum元素的名稱加上了enum的名稱。可以說,Fruit::orangeFruitOrange更整潔,但對我的眼睛來說真的沒有什麼不同。

在一些平行宇宙中,這將是巨大的,在這你可以寫一門語言:

Fruit selected = orange; 

,並讓編譯器推斷不變的命名空間的右側。但是我不明白這種語言可能是怎樣的。C在這個意義上沒有命名空間,即使它是這樣,類型系統也只允許轉換;你不能根據LHS來調整操作符的RHS的語法(並且我故意使用單詞語法,因爲名稱查找是C中的語法屬性)。

即使你確實有這有時implictly插入一個枚舉的命名空間的一些語言黑客,你仍然需要在任何比較明確的前綴,因爲

if (apple > orange) 

沒有上下文中扣除可能發生儘管C中枚舉值都是int類型的事實確實使得FruitAppleFruitOrange具有可比性。