我对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访问该类型。
加里
答案 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可以获得更深入的描述。