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

时间:2016-02-13 13:08:40

标签: 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

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

旁注:这个问题已经有了C ++的答案

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

我正在寻找C99解决方案。

1 个答案:

答案 0 :(得分:4)

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

正如OP中所指出的,C ++有许多机制,其中enum class可能适用于现代代码。但是,在实践中结果是相同的:您最终使用枚举的名称为枚举元素的名称添加前缀。可以说,Fruit::orangeFruitOrange更整洁,但实际上它对我的眼睛没什么影响。

在某些平行的宇宙中,拥有一种可以编写的语言会很棒:

Fruit selected = orange;

让编译器在右侧推导出常量的命名空间。但是我不知道那种语言是怎样的.C在这个意义上没有命名空间,即使它确实如此,类型系统也只允许转换;你不能基于LHS来调整运算符的RHS的语法(我故意使用单词语法,因为名称查找是C语法中的一个语法属性)。

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

if (apple > orange)

没有可以进行演绎的上下文,即使C中的枚举值都是int类型的事实确实使FruitAppleFruitOrange具有可比性。