在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。但是,这也很容易出现输入错误。
”当您开始使用另一位时会发生什么。“同意。当你添加一个新选项时,你是否希望每个使用'FubarAllOptions'的人总是*启用新的选项?很难想象这个用例。你应该仔细问问为什么你甚至想要一个“所有选项,不管它们是什么意思,应该在”设置。 “翻转所有开关!!!”通常不是推荐的编程模式。 –
@Sulthan不正确。输入错误导致了数百万美元的灾难。 – fff444
(我不禁想起gcc的'-Wall',它实际上并没有打开所有警告。) –