![](/img/trans.png)
[英]With typedef enum, return type enum EnumName produces compiler error when returning an enum member
[英]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.