2017-09-15 103 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',它实际上并没有打开所有警告。) –