避免与C中的枚举发生名称冲突(C99)

Pao*_*olo 4 c enums namespaces c99

enum 元素名称容易与其他枚举元素名称,变量名称等重叠/冲突...

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


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


char apple='a'; // <-- ERROR
Run Code Online (Sandbox Code Playgroud)

除了为每个枚举元素名称加上前缀之外,是否有符合C99的解决方案来避免冲突?


旁注:这个问题已经为C ++提供了答案

如何避免在C ++中具有相同名称的两个枚举值的名称冲突?

我正在寻找C99解决方案。

ric*_*ici 6

在C语言中,除了为枚举值的名称加上前缀之外,没有其他解决方案。

正如OP中指出的那样,C ++具有多种机制,enum class现代代码可能已指出了其中的几种机制。但是,实际上结果是一样的:您最终在enum元素的名称前添加了enum的名称。可以说Fruit::orange比整齐FruitOrange,但实际上对我的眼睛没什么影响。

在某些并行世界中,拥有一种您可以编写的语言会很棒:

Fruit selected = orange;
Run Code Online (Sandbox Code Playgroud)

并让编译器在右侧推导常量的名称空间。但是我不知道这种语言怎么可能成为C。C在这种意义上没有命名空间,即使有命名空间,类型系统也只允许转换。您不能基于LHS来限制运算符RHS的语法(并且我故意使用单词语法,因为名称查找是C语言的语法属性)。

即使您确实有一些语言黑客有时会隐式插入一个枚举名称空间,您仍然需要在任何比较中使用显式前缀,因为

if (apple > orange)
Run Code Online (Sandbox Code Playgroud)

没有在扣除可能发生,即使事实上,在C枚举值都是类型的情况下int,是否会FruitAppleFruitOrange可比性。