2010-04-02 41 views
15

在示例代碼中,我已經看到了這一點:Objective C - 什麼時候應該在「enum」前面加上「typedef」,以及什麼時候應該命名一個枚舉?

typedef enum Ename { Bob, Mary, John} EmployeeName; 

這:

typedef enum {Bob, Mary, John} EmployeeName; 

這:

typedef enum {Bob, Mary, John}; 

但什麼成功地爲我編的是:

enum {Bob, Mary, John}; 

我將該行放在@interface行上面的.h文件中,然後當我將#h文件導入不同類的.m文件時,可以看到該枚舉。

那麼,什麼時候需要其他變體呢?

如果我能說出枚舉像EmployeeNames的,然後,當我輸入「EmployeeNames的」後跟一個「」,如果列表彈出顯示枚舉的選擇是什麼就好。

+0

您可能也有興趣︰http://stackoverflow.com/questions/1675351/typedef-struct-vs-struct-definitions – 2010-04-02 21:37:01

回答

22

在C(以及Objective C)中,每次使用枚舉類型時都必須以enum作爲前綴。

enum MyEnum enumVar; 

通過使一個typedef:

typedef MyEnum MyEnumT; 

你可以寫短:

MyEnumT enumVar; 

替代聲明聲明枚舉本身和一個聲明typedef的。

// gives the enum itself a name, as well as the typedef 
typedef enum Ename { Bob, Mary, John} EmployeeName; 

// leaves the enum anonymous, only gives a name to the typedef 
typedef enum {Bob, Mary, John} EmployeeName; 

// leaves both anonymous, so Bob, Mary and John are just names for values of an anonymous type 
typedef enum {Bob, Mary, John}; 
+0

這些都是有用的答案。這種聲明枚舉類型變量的想法很有趣。這樣做,我想,限制了變量的可能值。我從來沒有用過像其他語言那樣的枚舉。我只是將枚舉聲明本身用作可能值的持有者。例如: 如果MyFish = FishSpecies.Mackeral則... 或者,如I型,我可以智能感知如下: X = FishSpecies.Cod Hallibut 鯖魚 等。(對不起,我不能在此格式)Xcode可以用一個枚舉來完成這種智能感知,比如VB嗎? – 2010-04-03 03:29:02

+0

@Scott - 問題是,在C中,可能的枚舉值名稱被合併到全局範圍中(或者在C++中,它們進入聲明枚舉類型的相同名稱空間中)。所以實際上'FishSpecies'不包含任何叫做'Cod'的東西。你只需要說'Cod'。在C++中,它總是聲明嵌套在某些類或名稱空間中的枚舉,以避免污染全局名稱空間。在C++ 1x中,將會有一個增強的枚舉類型,您可以在其中編寫'FishSpecies :: Cod'。當然,在C#,VB.NET(以及我認爲的Java 5或更高版本)中,您已經獲得了您熟悉的內容。 – 2010-04-03 07:25:52

+0

我很確定Objective C保持忠實於純粹的ANSI C,除了動態的OO擴展之外,它與其他語言非常分離。 C++的完全不同的方法也是「更好的C」。雖然優點是你可以將兩種語言結合起來並獲得Objective C++(這是我在iPhone開發中涉及的內容,因爲iPhone上沒有GC,並且C++支持稱爲智能指針的基本解決方案...... ) – 2010-04-03 07:28:57

0

你的第三個例子是與您的最後一個例子 - 在typedef有沒用 - GCC甚至給出了一個關於這種情況下警告:

warning: useless storage class specifier in empty declaration 

您的第一個和第二個例子也是部分等同,因爲它們都給枚舉類型名稱EmployeeName。第一個示例還允許您與EmployeeName交替使用enum Ename;在第二個示例中,EmployeeName是唯一的選項。第二個例子必須像你一樣寫 - 你可以分解第一個例子如下:

enum Ename { Bob, Mary, John }; 
typedef enum Ename EmployeeName; 

也許這有助於清理事情?

4

enum { }內部的名稱定義了枚舉值。當你給它一個名字時,你可以將它作爲一個類型與關鍵字enum一起使用,例如, enum EmployeeName b = Bob;。如果您也是typedef它,那麼當您聲明該類型的變量時,您可以刪除enum,例如, EmployeeName b = Bob;而不是前面的示例。

相關問題