在哪种情况下应该使用匿名枚举?

2r2*_*r2w 12 c c++

在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,onetwo.在C中,常数总是类型的int,这是公认的奇数和的初始化obj从涉及的隐式转换intenum foo.

在C++中,类型enum foo也可以称为just foo,并且常量是类型enum foo(与某些整数类型兼容,不一定int).

  • 枚举常量相对于#defines的另一个优点是可以在宏扩展内定义它们。 (2认同)

gee*_*aur 5

另一个用例是作为 a structor的元素union,通常当单独使用它没有意义时(因为它的存在只是为了满足通信协议的 ABI 等,并且有更适合编程使用的表示) )。