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解决方案。
答案 0 :(得分:4)
在C中,除了为枚举值的名称添加前缀之外,没有其他解决方案。
正如OP中所指出的,C ++有许多机制,其中enum class
可能适用于现代代码。但是,在实践中结果是相同的:您最终使用枚举的名称为枚举元素的名称添加前缀。可以说,Fruit::orange
比FruitOrange
更整洁,但实际上它对我的眼睛没什么影响。
在某些平行的宇宙中,拥有一种可以编写的语言会很棒:
Fruit selected = orange;
让编译器在右侧推导出常量的命名空间。但是我不知道那种语言是怎样的.C在这个意义上没有命名空间,即使它确实如此,类型系统也只允许转换;你不能基于LHS来调整运算符的RHS的语法(我故意使用单词语法,因为名称查找是C语法中的一个语法属性)。
即使您确实有某些语言黑客有时会隐含地插入枚举命名空间,您仍然需要在任何比较中使用显式前缀,因为
if (apple > orange)
没有可以进行演绎的上下文,即使C中的枚举值都是int
类型的事实确实使FruitApple
和FruitOrange
具有可比性。