2017-09-15 102 views
1

在C的objective-c變種中,存在NS_OPTIONS來幫助驗證位掩碼。但它似乎有一個固有的缺陷。如果我需要定義一個表示所有位的按位「或」的值,例如FubarAllOptions有人會說這個約定是簡單地使用INT_MAX。但是這有一個問題。NS_OPTIONS有缺陷嗎?

想象一下,我使用NS_OPTIONS作爲uint8_t的低五位。例如

typedef NS_OPTIONS(uint8_t) { 
FubarA=1, 
FubarB=1<<1, 
FubarC=1<<2, 
FubarD=1<<3, 
FubarE=1<<4, 
FubarAllOptions=0xff // MAX 
} FubarOptions; 

如果我逐位明確每一個FubarOptions變量的分配的比特,剩下的三個高位比特將保持置。因此,如果我檢查NS_OPTIONS值是否爲非零作爲是否清除所有位的測試,則會顯示某些位仍被設置。因此一個錯誤。 FubarAllOptions包含未分配的位。

問:我如何定義FubarAllOptions,使其只包含指定的位,而不費力地輸出所有可能的選項並對它們進行操作?即FubarA | FubarB | ....但是,這將容易受到錯字錯誤的影響。

當然,我可以採取最大的,< < 1並減1。但是,這也很容易出現輸入錯誤。

回答

2

您必須手動設置所有選項:

FubarAllOptions = (FubarA | FubarB | FubarC | FubarD | FubarE) 

當然,你也可以隨時檢查每一個選項,無需手動屏蔽所有這些,然後和零比較解決這個問題。

當你開始使用另一個位時,你應該擔心會發生什麼,你太擔心輸入錯誤。 「

+1

」當您開始使用另一位時會發生什麼。「同意。當你添加一個新選項時,你是否希望每個使用'FubarAllOptions'的人總是*啓用新的選項?很難想象這個用例。你應該仔細問問爲什麼你甚至想要一個「所有選項,不管它們是什麼意思,應該在」設置。 「翻轉所有開關!!!」通常不是推薦的編程模式。 –

+0

@Sulthan不正確。輸入錯誤導致了數百萬美元的災難。 – fff444

+0

(我不禁想起gcc的'-Wall',它實際上並沒有打開所有警告。) –