2009-11-30 93 views
3

直到我意識到我不需要命名emun時,我對typedef/enum有點困惑。在使用typedef時,這兩者之間有什麼區別/好處,第二個對我來說似乎更容易理解。unnamed enum&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 optionSelect = save; 
enum enumMenuItems optionSelect = save; 

上述兩個聲明基本上是相同的,一個使用利用枚舉typedef的和其他。因此,如果您使用typedef,則可以將您的枚舉保留爲未命名,因爲可以通過typedef menuItem訪問該類型。

加里

+0

我對你的編輯有點困惑,佈局不僅僅是風格/個人喜好的問題? – fuzzygoat 2009-11-30 18:27:16

+0

當然,只是想區分聲明和枚舉的使用。 NBD。 – 2009-11-30 19:54:52

+0

編輯中的註釋看起來基本正確。有一些語義上的狡辯,但實際上我認爲它不重要。 – 2009-11-30 19:55:52

回答

5

第一種情況可以讓你參考類型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獲得。