在示例代码中,我看到了这一点:
typedef enum Ename { Bob, Mary, John} EmployeeName;
和此:
typedef enum {Bob, Mary, John} EmployeeName;
和此:
typedef enum {Bob, Mary, John};
但为我成功编译的是:
enum {Bob, Mary, John};
我将该行放在@interface行上方的.h文件中,然后当我将该.h文件#import转换为另一个类的.m文件时,方法可以看到枚举。
那么,何时需要其他变种?
如果我可以将枚举命名为EmployeeNames,那么当我输入“EmployeeNames”后跟“。”时,如果弹出一个列表显示枚举选项是什么,那就太好了。
答案 0 :(得分:22)
在C(以及目标C)中,每次使用时,枚举类型都必须以enum
为前缀。
enum MyEnum enumVar;
制作一个typedef:
typedef MyEnum MyEnumT;
你可以写更短的内容:
MyEnumT enumVar;
替代声明在一个声明中声明了枚举本身和typedef。
// gives the enum itself a name, as well as the typedef
typedef enum Ename { Bob, Mary, John} EmployeeName;
// leaves the enum anonymous, only gives a name to the typedef
typedef enum {Bob, Mary, John} EmployeeName;
// leaves both anonymous, so Bob, Mary and John are just names for values of an anonymous type
typedef enum {Bob, Mary, John};
答案 1 :(得分:4)
enum { }
中的名称定义了枚举值。当您为其命名时,您可以将其与关键字enum
一起用作类型,例如enum EmployeeName b = Bob;
。如果您还typedef
它,那么您可以在声明该类型的变量时删除enum
,例如EmployeeName b = Bob;
代替上一个示例。
答案 2 :(得分:0)
你的第三个例子与你的上一个例子相同 - typedef
没用 - GCC甚至对这个案例发出警告:
warning: useless storage class specifier in empty declaration
您的第一个和第二个示例也部分相同,因为它们都为枚举类型指定了名称EmployeeName
。第一个示例还允许您与enum Ename
互换使用EmployeeName
;在第二个示例中,EmployeeName
是唯一的选择。第二个例子必须按照你的方式编写 - 你可以按如下方式分解第一个例子:
enum Ename { Bob, Mary, John };
typedef enum Ename EmployeeName;
也许这有助于清理事情?