2016-02-13 48 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具有可比性。