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解决方案。
发布于 2016-02-13 06:20:20
在C中,除了为枚举值的名称加上前缀之外,没有其他解决方案。
正如OP中所指出的那样,C++有许多机制,其中enum class
可能是现代代码中指定的。但是,在实践中,结果是相同的:您将枚举元素的名称以枚举的名称作为前缀。可以说,Fruit::orange
比FruitOrange
更整洁,但它对我的眼睛没有多大影响。
在一些平行的宇宙中,有一种你可以用之写作的语言是很好的:
Fruit selected = orange;
并让编译器在右边推导常量的命名空间.但我看不出这种语言是什么意思。C语言在这个意义上没有名称空间,即使有名称空间,类型系统也只允许转换;您不能基于LHS对操作符的RHS语法进行修改(我是故意使用单词语法的,因为名称查找是C中的一个语法属性)。
即使您确实有一些语言黑客,有时还隐含地插入了enum命名空间,但是您仍然需要在任何比较中使用显式前缀,因为
if (apple > orange)
即使C中的枚举值都是int
类型,也没有可以进行演绎的上下文,这使得FruitApple
和FruitOrange
具有可比性。
https://stackoverflow.com/questions/35380279
复制