2013-06-28 185 views
3

有了這些枚舉...枚舉類型檢查編譯器?

typedef enum { 
    ThisThingA = 0, 
    ThisThingB = 1 
} ThisThing; 

typedef enum { 
    ThatThingX = 8, 
    ThatThingY = 9 
} ThatThing; 

這些屬性...

@property (nonatomic) ThisThing thisThing; 
@property (nonatomic) ThatThing thatThing; 

我能做到這一點...

self.thisThing = thatThingX; 

,我沒有得到一個警告從編譯器,我期望。爲什麼沒有編譯器的警告?爲什麼我可以將類型爲ThatThing的東西指定給ThisThing類型的東西?

編輯按馬丁的R回答:但如果我這樣做...

[self setThisThing:thatThingX]; 

我得到警告:從枚舉類型「ThatThing」不同的枚舉類型「ThisThing」

隱式轉換

(Xcode 4.6.3和iOS 6.0)

+0

int a = 5; int b = 6; a = b - 無警告) – 2013-06-28 07:03:07

+0

我曾經在這種情況下得到警告。因爲我不介意他們,我不能說哪個選項可以啓用或禁用這些警告。 –

+0

@Maria好的,我明白了。但是這些都是打字的。我是新的,但我認爲這是typedef的要點。 –

回答

1

編譯器選項「隱枚舉轉換(-Wenum轉換)」在默認情況下,如果你分配給不同的枚舉類型的變量你實際上得到一個警告 :

ThisThing x = ThatThingX; 

,或者您使用的setter方法來設置屬性:

[self setThisThing:ThatThingX]; 

在這兩種情況下,你得到警告

 
implicit conversion from enumeration type 'ThatThing' to different enumeration type 'ThisThing' [-Wenum-conversion] 

只有當你使用「點」語法來設置值

self.thisThing = ThatThingX; 

那麼你沒有得到一個警告,所以這可能是在編譯器中的錯誤。

-1

實際上,枚舉選項被視爲NSInteger。所以thatThingX默認值爲0。當你指定self.thisThing = thatThingX;self.thisThing得到了0的值。所以它會變成ThisThingA。這就是爲什麼沒有警告。

+0

我編輯了我的問題,因此每個枚舉選項都有唯一的值。仍然沒有警告。 –

0

enum是一個整數類型的C構造。它是類型檢查。你的用法是相同的默認整數類型,所以在編譯器的眼中沒有任何錯誤或根本沒有錯。 您的用法是int。

如果將typedef int作爲Bob並再次作爲Josephine,那麼這對於代碼清晰度來說很方便。鮑勃和約瑟芬仍然是int類型。

如果聲明兩個枚舉,但一個使用NSUInteger,另一個使用NSInteger,則可能會根據隱式轉換的設置獲取警告。

這真是一個C問題。