【问题标题】:Objective C - when should "typedef" precede "enum", and when should an enum be named?Objective C - 什么时候应该“typedef”在“enum”之前,什么时候应该命名一个枚举?
【发布时间】:2011-02-03 21:15:05
【问题描述】:

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

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

【问题讨论】:

标签: objective-c enums typedef


【解决方案1】:

在 C(以及 Objective 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};

【讨论】:

  • 这些都是有用的答案。声明枚举类型变量的想法很有趣。我想,这样做会限制变量的可能值。我从来没有在其他语言中使用过这样的枚举。我只是将枚举声明本身用作可能值的持有者。例如:如果 MyFish = FishSpecies.Mackeral Then... 或者,当我键入时,我可以得到 IntelliSense,如下所示:x = FishSpecies.Cod Hallibut Mackeral 等(抱歉,我无法在评论中格式化。) Xcode 可以吗用枚举做那种 IntelliSense,比如 VB?
  • @Scott - 问题是在 C 中可能的枚举值名称被合并到全局范围中(或者在 C++ 中,它们进入声明枚举类型的同一个命名空间)。所以事实上FishSpecies 不包含任何称为Cod 的东西。你只需要说Cod。在 C++ 中,始终声明嵌套在某个类或命名空间中的枚举以避免污染全局命名空间是一种很好的做法。在 C++1x 中将有一个增强的枚举类型,您可以在其中编写 FishSpecies::Cod。当然,在 C#、VB.NET(我认为还有 Java 5 或更高版本)中,您已经掌握了您所熟悉的内容。
  • 我很确定 Objective C 忠实于普通的 ANSI C,除了动态的 OO 扩展与语言的其余部分非常分离。与旨在成为“更好的 C”的 C++ 完全不同的方法。虽然优点是您可以结合这两种语言并获得 Objective C++(如果我涉足 iPhone 开发,我会使用它,因为 iPhone 上没有 GC,并且 C++ 支持一种称为智能指针的基本解决方法......查一下!)
  • 与结构体一样,以下也可以:typedef enum MyEnum MyEnum; 因为它们在不同的命名空间中,所以标签和类型名称可以相同
  • 我们应该把 typedef 枚举放在接口声明里面还是外面?我正在使用 Apple LLVM 4.0
【解决方案2】:

您的第三个示例与您的上一个示例相同 - typedef 没有用 - GCC 甚至对这种情况发出警告:

warning: useless storage class specifier in empty declaration

您的第一个和第二个示例也部分等效,因为它们都为枚举类型命名为EmployeeName。第一个示例还允许您将enum EnameEmployeeName 互换使用;在第二个示例中,EmployeeName 是唯一的选项。第二个示例必须按照您的方式编写 - 您可以将第一个示例分解如下:

enum Ename { Bob, Mary, John };
typedef enum Ename EmployeeName;

也许这有助于解决问题?

【讨论】:

    【解决方案3】:

    enum { } 中的名称定义了枚举值。当你给它一个名字时,你可以将它与关键字enum一起用作类型,例如enum EmployeeName b = Bob;。如果您还 typedef 它,那么您可以在声明该类型的变量时删除 enum,例如EmployeeName b = Bob; 而不是前面的例子。

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 2010-12-30
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      相关资源
      最近更新 更多