簡體   English   中英

枚舉不是由編譯器檢查的類型?

[英]enum Not Type Checked by Compiler?

有了這些枚舉......

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類型的東西?

根據Martin R的回答編輯:但如果我這樣做......

[self setThisThing:thatThingX];

我收到警告:從枚舉類型'ThatThing'到不同的枚舉類型'ThisThing'的隱式轉換

(Xcode 4.6.3和iOS 6.0)

默認情況下,編譯器選項“Implicit Enum Conversions(-Wenum-conversion)”處於啟用狀態,如果您指定了不同枚舉類型的變量,則實際上會收到警告:

ThisThing x = ThatThingX;

或者如果使用setter方法設置屬性:

[self setThisThing:ThatThingX];

在這兩種情況下,您都會收到警告

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

僅當您使用“點”語法設置值時

self.thisThing = ThatThingX;

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

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

如果你將typedef int作為Bob並再次作為Josephine,這樣可以方便代碼清晰度。 鮑勃和約瑟芬仍然是同一類型int。

如果您聲明兩個枚舉但一個使用NSUInteger而另一個使用NSInteger,則可能會收到警告,具體取決於隱式轉換的設置。

這真的是一個C問題。

實際上,枚舉選項被視為NSInteger。 因此,默認情況下, theThingX的值為0。 當你分配self.thisThing = thatThingX; self.thisThing的值為0.所以它將成為ThisThingA 這就是沒有警告的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM