【发布时间】:2012-04-14 20:38:38
【问题描述】:
在 c 和 c++ 中,enum 可以用标签定义
enum e_smth {
smth_one,
smth_two,
smth_err
};
或不带标签
enum {
smth_one,
smth_two,
smth_err
};
如果它是用标记定义的,那么在 c 和 c++ 中的 switch 语句中都是有意义的:
e_smth some_var;
....//do some stuff with some_var
switch (some_var)
{
case smth_one:
break;
case smth_two:
break;
}
如果使用 gcc 或 g++ 编译,将产生-Wswitch 警告。
在 c++ 中的函数声明和变量初始化是有意义的:
e_smth var;
var=99;
如果用 g++ 编译会产生-fpermissive 错误。
带或不带标记的两种类型都可以用作一个文件#define 不带参数的宏。
更新
可以作为一个文件使用
#define不带参数的宏
意思是:不是在文件中写入#define MAX 1000,而是在文件范围内将MAX添加到全局使用enum { MAX=1000 }
那么匿名枚举呢,我只发现了一个用例:
像typedef enum { a,b,c } some_t; 这样的定义使它像带有标签的枚举一样工作
问题:
如果我还没有描述所有合理的用例,应该使用什么匿名枚举?
【问题讨论】:
-
如果我没记错的话,我不确定我是否完全有这个,早在那天你不得不将 typedef 与 enum 一起使用,或者在声明变量时使用“enum”关键字枚举类型。一旦你有了 typedef,在枚举上加一个标签就无关紧要了,所以我们没有打扰。所以,tl;dr:古代历史的东西。
-
> 在声明变量时使用“enum”关键字这是旧的很好的 C 语法,但我已经纠正了问题,因为这里没有任何意义 @mjfgates