2013-04-12 83 views
2

我最近調試了一個問題,這個問題是由於枚舉與非枚舉值進行比較而導致的。這裏是一個簡化的例子:我可以啓用警告來比較枚舉值和非枚舉值嗎?

typedef NS_ENUM(NSInteger, MyType) { 
    TypeVal1, 
}; 

... 

MyType type = TypeVal1; 
int randomValue = 0; 

BOOL compareTypeAndPrimiative = (randomValue == typeA); // No warning 

是否可以打開此警告?

如果如果需要通過明確鑄造我可以抑制:

BOOL iKnowWhatImDoing = (randomValue == (int) typeA); 

回答

3

有這類警告不支持,因爲C枚舉不是強類型的,我相信標準要求他們將被視爲整數(或未簽名的整數)。將它們與常規整數進行比較始終被允許作爲C標準的一部分,並且此類型的警告最終會標記許多正確的代碼。我確信有人可以鏈接到C標準的相應部分。

特別是對於iOS和Apple API,您會發現枚舉值通常用作位掩碼。在這些情況下,通常這樣寫代碼:

if ((value & flag) == kFlag) { ... } 

你可以說,使用枚舉用於此目的是一個壞主意,但你可能會最終不得不禁用此警告的各種代碼。

+0

很好的抓住了面具! – Sulthan

0

我剛剛通過LLVM手冊,似乎沒有這個選項。然後我試圖打開所有的編譯器警告(-Weverything),但沒有警告您的enum的情況。

所以答案是否定的。

避免此類錯誤的最佳解決方案是適當地命名變量/常量。明確變量/常量的含義。那麼比較中的錯誤也應該是顯而易見的。