我必须实现信号处理设备的set_configuration API。在设置之前,该 API 应确保用户提供的配置集是合法的(在预期范围内)。而且,配置值是离散形式的。
我想操作 C 中的预处理器指令来实现此条件检查; if/else 需要很多行来实现。
我想到的一个可能的解决方案如下;
typedef enum {VERY_LOW, LOW, HIGH, VERY_HIGH} config_first;
typedef enum {VERY_SHORT, SHORT, LONG, VERY_LONG} config_second;
typedef enum {SQUARE, CIRCLE, TRIANGLE, RECTANGLE} config_third;
typedef enum {GREEN, WHITE, YELLOW, BROWN, GREY} config_fourth;
typedef enum {WOOD, IRON, STEEL} config_fourth;
typedef enum {SWIM, FLY, RUN, WALK} config_fifth;
set_configuration(config_first first, config_second second, config_third third, config_fourth fourth, config_fifth fifth)
我的问题是,有什么方法可以将所有这些配置组合到一个枚举中,并使其如下:
set_configuration(config_set config)
其中 config_set 是预处理器指令。
最佳答案
您可以使用位字段来完成此操作,如下所示:
typedef enum {VERY_LOW = 0x00,
LOW = 0x01,
HIGH = 0x02,
VERY_HIGH = 0x03,
VERY_SHORT = 0x00 << 2,
SHORT = 0x01 << 2,
LONG = 0x02 << 2,
VERY_LONG = 0x02 << 2,
SQUARE = 0x00 << 4,
CIRCLE = 0x01 << 4,
TRIANGLE = 0x02 << 4,
RECTANGLE = 0x03 << 4,
GREEN = 0x00 << 6,
WHITE = 0x01 << 6,
YELLOW = 0x02 << 6,
BROWN = 0x03 << 6,
GREY = 0x04 << 6,
WOOD = 0x00 << 9,
IRON = 0x01 << 9,
STEEL = 0x02 << 9,
SWIM = 0x00 << 11,
FLY = 0x01 << 11,
RUN = 0x02 << 11,
WALK = 0x03 << 11
} config;
set_configuration(config_set config);
然后通过将字段OR
组合在一起来设置您的配置,例如
set_configuration(LOW | SHORT | CIRCLE | WHITE | IRON | FLY);
维护枚举可能很痛苦,因为您必须手动确保字段不重叠等。可以通过为每个字段值和移位使用多个枚举来改进它 - 这会增加更多困惑,但可能使维护更容易。
[注意:您在问题中提到使用预处理器 - 目前尚不清楚您想要实现什么目标,但如果您需要进行编译时检查而不是运行时检查,那么您可以使用与上面,但将 enum
替换为 #define
。]
关于c - 如何在 C 中以任何预处理器指令形式定义一组配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22319939/