NS_OPTIONS有缺陷吗?

时间:2017-09-15 16:35:27

标签: objective-c c

在C的objective-c变体中,存在NS_OPTIONS以帮助验证位掩码。但它似乎有一个固有的缺陷。如果我需要定义一个表示所有位的按位OR的值,例如有些人会说FubarAllOptions只是简单地使用INT_MAX。然而,这有一个问题。

想象一下,我使用NS_OPTIONS作为uint8_t的低五位。 e.g。

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值是否为非零,作为是否清除所有位的测试,则会显示某些位仍然设置。因此一个bug。 FubarAllOptions包括未分配的位。

问:我如何定义FubarAllOptions以便它只包含已分配的位,而无需费力地键入所有可能的选项和Or'ing它们?即FubarA | FubarB | ....但这很容易受到错字错误的影响。

当然我可以拿最大的,&lt;&lt;&lt; 1并减去1.但是这也容易受到错字错误的影响。

1 个答案:

答案 0 :(得分:2)

您必须手动设置所有选项:

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

当然,您也可以通过手动检查每个选项而不是全部屏蔽它们然后与零进行比较来解决问题。

当你开始使用另一位时,你应该更担心会发生什么,你太担心输入错误。