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

避免与C(C99)中的枚举发生名称冲突,c,enums,namespaces,c99,C,Enums,Namespaces,C99,enum元素的名称容易与其他两个enum元素名称、变量名称等重叠/冲突 enum Fruit { apple, orange }; typedef enum Fruit Fruit; enum Color { red, orange // <-- ERROR }; typedef enum Color Color; char apple='a'; // <-- ERROR 枚举水果 { 苹果, 橙色 }; 果实类型; 枚举颜色 { 红色 橙色

enum
元素的名称容易与其他两个enum元素名称、变量名称等重叠/冲突

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


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


char apple='a'; // <-- ERROR
枚举水果
{
苹果,
橙色
};
果实类型;
枚举颜色
{
红色

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

正如OP所指出的,C++有很多机制,其中代码“> EnUM类< /C>”可能是现代代码所指的。然而,实际上,结果是用EnUM的名字来预先命名EnUM元素的名称。对我的眼睛来说没什么区别

在一些平行的宇宙中,如果有一种语言,你可以用它来写:

Fruit selected = orange;
让编译器推断出右边常量的名称空间。但我不明白这种语言怎么可能是C。C没有这种意义上的名称空间,即使有,类型系统也只允许转换;你不能根据LHS来调整运算符RHS的语法(我故意使用syntax这个词,因为名称查找在C中是一个语法属性)

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

if (apple > orange)

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

是的,使用合适的名称,如
color\u orange
Froot\u orange
。在阅读。是否有[…]除了在每个枚举元素名称前加前缀之外的其他解决方案?可能是,但这可能是一个不好的解决方案,这也是一个有助于可读性的好解决方案。有什么比
Fruit f=orange;
Color c=orange;
更好的可读性吗?这比
f
是一个水果和
c
a colorYes
水果水果=水果橙;
。哦,在这种情况下,
开关(水果){case水果橙:中断…}
。如果有很多水果,你会很高兴给它们加上前缀。
f
也可以是
file
f**ck
,以及许多其他以
f
水果
开头的WROD,而仅仅是
水果