区别在于第二种方法声明了名为enum SomeEnum
的类型,并且还声明了typedef名称SomeEnum
- 该类型的别名。它实际上可以组合成一个相当于班轮
typedef enum SomeEnum { first, second, third } SomeEnum;
这使得它相当明显的是,这两种方法之间的唯一区别是是否有在enum
关键字后面的名称。使用第二种方法,您可以使用SomeEnum e
或enum SomeEnum e
(无论您喜欢哪个)声明该枚举类型的对象。
第一种方法仅声明typedef-name SomeEnum
为最初的匿名枚举类型,这意味着您仅限于SomeEnum e
声明。
因此,只要您在声明中只使用typedef-name SomeEnum
,两者之间就没有区别。但是,在某些情况下,您可能需要使用类型enum SomeEnum
的完整原始名称。在名字不可用的第一种方法中,所以你会走运。
例如,如果上述声明之后,你还声明在一些嵌套的范围
int SomeEnum;
变量的名称将隐藏枚举的typedef的名称命名SomeEnum
变量,从而使这一声明非法
SomeEnum e; /* ERROR: `SomeEnum` is not a type */
但是,如果你声明枚举时使用的第二种方法,您可以使用完整的类型名称
解决此问题
enum SomeEnum e; /* OK */
如果您在声明枚举类型时使用第一种方法,则这是不可能的。
当结构使用时,struct
后的名称是必须的,当你需要一个自引用类型(即包含一个指向同一类型的类型),像
typedef struct SomeStruct {
struct SomeStruct *next;
} SomeStruct;
最后,在第二种方法typedef名称是完全可选的。您可以简单地声明
enum SomeEnum { first, second, third };
并且只是在每次需要引用此类型时都使用enum SomeEnum
。
来源
2010-07-06 21:43:45
AnT