在c和c ++中enum都可以用tag定义
enum e_smth {
smth_one,
smth_two,
smth_err
};
Run Code Online (Sandbox Code Playgroud)
或没有标签
enum {
smth_one,
smth_two,
smth_err
};
Run Code Online (Sandbox Code Playgroud)
如果它是用tag定义的,那么switch在c和c ++ 中的语句中都是有意义的:
e_smth some_var;
....//do some stuff with some_var
switch (some_var)
{
case smth_one:
break;
case smth_two:
break;
}
Run Code Online (Sandbox Code Playgroud)
-Wswitch如果用gcc或g ++编译它会产生 警告.
它在c ++中的函数声明和变量初始化中是有意义的:
e_smth var;
var=99;
Run Code Online (Sandbox Code Playgroud)
-fpermissive如果用g ++编译会产生错误.
带或不带标记的两种类型都可以用作#define没有参数的一个文件宏.
更新
可以用作
#define没有参数的一个文件宏
意思是:而不是在文件范围内写入#define MAX 1000文件并将MAX添加到全局使用enum { MAX=1000 }
那么匿名枚举,我发现只有一个用例:定义就像使用typedef enum { a,b,c } some_t;带标签的枚举一样
如果我还没有描述所有合理的用例,应该使用匿名枚举的内容?
Kei*_*son 17
在C(但不是在C++中),enum可以[ab]用于定义int常量.
例如,鉴于此声明:
const int MAX = 1024;
Run Code Online (Sandbox Code Playgroud)
MAX它不是一个常量表达式,它是一个只读对象的名称.这意味着您不能在案例标签中使用它,因为在文件范围static或在任何其他需要常量表达式的上下文中声明的数组的大小.
但如果你写:
enum { MAX = 1024 };
Run Code Online (Sandbox Code Playgroud)
然后MAX 是类型的常量表达式int,可以在任何可以使用常量的上下文中使用1024.
当然你也可以写:
#define MAX 1024
Run Code Online (Sandbox Code Playgroud)
但是使用预处理器有一些缺点:例如,标识符的范围不是普通声明的方式.
缺点是这样的常数只能是类型int.
C++有不同的规则; 枚举常量是枚举类型,不是int,但您可以将声明的常量对象用作常量表达式(只要初始化程序是常量表达式).
为了解决原始问题,当你使用enum声明来创建这样的常量时,没有标记或typedef是没有意义的,因为你永远不会使用类型本身.
背景:这个:
enum foo { zero, one, two };
enum foo obj = two;
Run Code Online (Sandbox Code Playgroud)
创建一个类型enum foo和常量zero,one和two.在C中,常数总是类型的int,这是公认的奇数和的初始化obj从涉及的隐式转换int到enum foo.
在C++中,类型enum foo也可以称为just foo,并且常量是类型enum foo(与某些整数类型兼容,不一定int).
| 归档时间: |
|
| 查看次数: |
11595 次 |
| 最近记录: |