【问题标题】:unnamed enum & typedef?未命名的枚举和类型定义?
【发布时间】:2009-11-30 17:56:58
【问题描述】:

我对 typedef/enum 有点困惑,直到我意识到我不需要为 emun 命名。与 typedef 一起使用时,这两者之间有什么区别/好处吗?对我来说,第二个似乎更容易理解。

第一个例子:

typedef enum enumMenuItems {
    none,
    add,
    save,
    load,
    list,
    remove
} menuItems;

menuItems optionSelect = none;

第二个例子:

typedef enum {
    Earth = 1, 
    Mars,
    Saturn,
    Neptune,
    Jupiter
} planets;

planets closest = Mars;

.

编辑:

typedef enum enumMenuItems {
    none,
    add,
    save,
    load,
    list,
    remove
} menuItems;

所以上面基本上定义了两种类型,一种是 enum,称为 enumMenuItems,第二种是 enumMenuItems 的 typedef,称为 menuItems。

menuItems optionSelect = save;
enum enumMenuItems optionSelect = save;

上面两个声明本质上是一样的,一个使用typedef,一个使用enum。因此,如果您使用 typedef,您可以不命名枚举,因为可以通过 typedef menuItem 访问该类型。

加里

【问题讨论】:

  • 我对你的编辑有点困惑,布局不仅仅是风格/个人喜好的问题吗?
  • 当然,只是想更好地区分枚举的声明和使用。 NBD。
  • 您编辑的 cmets 似乎基本正确。有一些语义上的小问题,但实际上我认为这并不重要。
  • 谢谢卡尔,我明白了,然后继续 :) 用语义上的小问题打我,我当然有兴趣把事情做好。
  • 查看我的回答中的常见问题解答链接;它包含所有坚韧不拔的细节。

标签: objective-c


【解决方案1】:

第一种情况允许您将类型称为enum enumMenuItems。例如:

enum enumMenuTimes optionSelect = none;

如果你把它分成两部分可能会更清楚:

enum _planets { 
    Earth = 1, 
    Mars, 
    Saturn,
    Neptune,
    Jupiter
};
typedef enum _planets planets;

enum _planets planet1 = Earth;
planets       planet2 = Mars;

如果这样可以为您简化概念。您的第二个符号只是速记;它创建一个匿名枚举,然后使用typedef 为其命名。例如,您甚至可以这样做:

enum {
    Value0,
    Value1,
    Value2
};

但是你不能像你试图做的那样使用枚举作为一个假的类型名称。不过,您仍然可以访问枚举值。

comp.lang.c FAQ 提供更深入的说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2015-08-17
    • 2011-09-11
    • 2021-06-29
    • 1970-01-01
    相关资源
    最近更新 更多