enum e_smth { smth_one,smth_two,smth_err };
或没有标签
enum { smth_one,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; }
会产生-Wswitch警告,如果这将使用gcc或g编译.
在c中的函数声明和变量初始化中是有意义的:
e_smth var; var=99;
两种带或不带标签的类型都可以用作一个没有参数的文件#define宏.
更新
could be used as one file
#define
macro without parameters
意思是:不是在文件中写入#define MAX 1000,而是在文件范围内将MAX添加到全局使用枚举{MAX = 1000}
匿名枚举怎么办,我发现只有一个用例:
定义像typedef枚举{a,b,c} some_t;使其像枚举一样工作
题:
如果我还没有描述所有合理的用例,应该使用匿名枚举?
解决方法
例如,给出这个声明:
const int MAX = 1024;
MAX不是常量表达式,它是只读对象的名称.这意味着您不能在案例标签中使用它,因为在文件范围或静态或在需要常量表达式的任何其他上下文中声明的数组的大小.
但如果你写:
enum { MAX = 1024 };
那么MAX是int类型的常量表达式,可以在任何可以使用常量1024的上下文中使用.
当然你也可以写:
#define MAX 1024
但是使用预处理器有缺点:例如,标识符的范围不限于普通声明.
缺点是这种常数只能是int类型.
C有不同的规则;枚举常数是枚举类型,而不是int,但可以使用声明的常量对象作为常量表达式(只要初始化器是常量表达式).
为了解决原始问题,当你使用枚举声明来创建这样的常量时,没有必要使用标签或typedef,因为你永远不会使用类型本身.
背景:这个:
enum foo { zero,one,two }; enum foo obj = two;
创建一个类型枚举foo,常量为零,一和二.在C中,这些常量始终是int类型,这是不可否认的,而obj的初始化涉及从int到enum foo的隐式转换.
在C中,类型枚举foo也可以称为foo,并且常量类型为枚举foo(与某种整数类型兼容,不一定是int).