目标C - 什么时候“typedef”应该在“enum”之前,什么时候应该枚举enum?

时间:2010-04-02 21:24:56

标签: objective-c enums typedef

在示例代码中,我看到了这一点:

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”后跟“。”时,如果弹出一个列表显示枚举选项是什么,那就太好了。

3 个答案:

答案 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;

也许这有助于清理事情?