避免与 C (C99) 中的枚举发生名称冲突
Avoid name collisions with enum in C (C99)
enum
元素的名称容易受到 overlap/collide 与其他枚举元素名称、变量名称等的影响...
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 解决方案。
在 C 中,除了在枚举值的名称前加上前缀外,没有其他解决方案。
正如 OP 中指出的那样,C++ 有许多机制,其中 enum class
可能适用于现代代码。但是,实际上结果是一样的:您最终在枚举元素的名称前加上枚举名称作为前缀。可以说,Fruit::orange
比 FruitOrange
更整洁,但在我看来,这实际上没什么区别。
在某个平行宇宙中,如果有一种语言可以用来编写,那就太好了:
Fruit selected = orange;
并让编译器推导出右侧常量的名称空间。但我不明白这种语言怎么可能是 C。C 在这个意义上没有名称空间,即使有,类型系统也只允许转换;您不能基于 LHS 来调节运算符的 RHS 语法(我故意使用语法这个词,因为名称查找是 C 中的语法 属性)。
即使您确实有一些有时会隐式插入枚举名称空间的语言技巧,您仍然需要在任何比较中使用显式前缀,因为
if (apple > orange)
没有可以进行推导的上下文,即使 C 中的枚举值都是 int
类型这一事实确实使 FruitApple
和 FruitOrange
具有可比性。
enum
元素的名称容易受到 overlap/collide 与其他枚举元素名称、变量名称等的影响...
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 解决方案。
在 C 中,除了在枚举值的名称前加上前缀外,没有其他解决方案。
正如 OP 中指出的那样,C++ 有许多机制,其中 enum class
可能适用于现代代码。但是,实际上结果是一样的:您最终在枚举元素的名称前加上枚举名称作为前缀。可以说,Fruit::orange
比 FruitOrange
更整洁,但在我看来,这实际上没什么区别。
在某个平行宇宙中,如果有一种语言可以用来编写,那就太好了:
Fruit selected = orange;
并让编译器推导出右侧常量的名称空间。但我不明白这种语言怎么可能是 C。C 在这个意义上没有名称空间,即使有,类型系统也只允许转换;您不能基于 LHS 来调节运算符的 RHS 语法(我故意使用语法这个词,因为名称查找是 C 中的语法 属性)。
即使您确实有一些有时会隐式插入枚举名称空间的语言技巧,您仍然需要在任何比较中使用显式前缀,因为
if (apple > orange)
没有可以进行推导的上下文,即使 C 中的枚举值都是 int
类型这一事实确实使 FruitApple
和 FruitOrange
具有可比性。