區別在於第二種方法聲明瞭名爲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