C 定义一个常数,该常数包含所有或所有的值

C 定义一个常数,该常数包含所有或所有的值,c,C,我的应用程序使用或ed值,如以下示例(伪): 这些常量以整数的形式在各种函数中获取或编辑,如下所示: OPTION_1 | OPTION_4 ... #define OPTION_ALL ?? <-- include all options 有时我有很多选择来传递我不喜欢的函数。我更喜欢这样的选项常量: OPTION_1 | OPTION_4 ... #define OPTION_ALL ?? <-- include all options 或者这

我的应用程序使用或ed值,如以下示例(伪):

这些常量以整数的形式在各种函数中获取或编辑,如下所示:

OPTION_1 | OPTION_4 ...
#define OPTION_ALL      ??   <-- include all options
有时我有很多选择来传递我不喜欢的函数。我更喜欢这样的选项常量:

OPTION_1 | OPTION_4 ...
#define OPTION_ALL      ??   <-- include all options
或者这是唯一的解决办法

#define OPTION_ALL      OPTION_1 | OPTION_2 | OPTION_3 | OPTION_4
解决方案:

看来这是最好的办法:

#define OPTION_1      0
#define OPTION_2      1
#define OPTION_3      2
#define OPTION_4      4
#define OPTION_ALL    (OPTION_4 * 2) - 1

它只使用最后一个选项作为输入

是,但
选项1
不能为0。它应该是1,然后
选项\u ALL
将是15

#define OPTION_1      1
#define OPTION_2      2
#define OPTION_3      4
#define OPTION_4      8
#define OPTION_ALL    15
基本上,您所做的是将二进制中的一位设置为每个选项的1。i、 e

#define OPTION_1      0b00000001
#define OPTION_2      0b00000010
#define OPTION_3      0b00000100
#define OPTION_4      0b00001000
#define OPTION_ALL    0b00001111

然后,您可以根据需要进行扩展。

选项\u ALL
应该是7,而不是8。这也是为什么您应该明确地编写OR,它可以保护您免受自己的数学错误。
#define OPTION_ALL 0xffffffff
不仅包括当前选项,还包括将来定义的选项,因为它设置了所有位。顺便说一句,你为什么把选项1定义为零呢?@StoryTeller,是的,我测试了它们,根据我或大约有多少个值,它们的值是1,3,5,7。但是,每当我更新选项时,这需要硬编码值:(好的,你可以按照myaut的建议去做,只是确保你还定义了一个无符号类型来保存所有这些选项。@myaut,没有任何理由。我认为只要我将值加倍就可以了。应该注意的是,二进制常量是一个扩展,而不是带有0x数字的标准Creplace 0b,以使其可移植。为了更好地理解,我使用了二进制,一旦有了它,就可以使用十进制或十六进制数。我看到了thanx。所以我只需要从下一个值中减去1,假设我从
1
开始。
OPTION\u 5 16
OPTION\u 31
都有效吗?