未命名的enum&的typedef?

时间:2009-11-30 17:56:59

标签: objective-c

我对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;

所以上面主要定义了两种类型,一种是enumMenuItems枚举,另一种是enumMenuItems的typedef,称为menuItems。

menuItems optionSelect = save;
enum enumMenuItems optionSelect = save;

以上两个声明基本相同,一个使用typedef,另一个使用enum。因此,如果您使用typedef,则可以保留未命名的枚举,因为可以通过typedef menuItem访问该类型。

加里

1 个答案:

答案 0 :(得分:6)

第一种情况允许您将类型称为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可以获得更深入的描述。