c - 如何在 C 中以任何预处理器指令形式定义一组配置

标签 c operating-system linux-device-driver embedded-linux enumeration

我必须实现信号处理设备的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/

相关文章:

c - 为什么 `libusb_bulk_transfer'返回0?

linux - 我们可以使用 fgets()、fputs()、feof() 等函数执行操作吗?对于像我们用于普通文件的 fifo 文件?

device-driver - I2C Linux 驱动程序

linux - i2c 节点中附加引脚的设备树绑定(bind)

c++ - 在 Go 应用程序中使用 C(++) 提高性能

c - 为什么以下从套接字上使用 fwrite() 到 write() 的转换失败?

c - 文件签名C

memory - 为什么要保留内存地址 0x0,为什么要保留?

sql-server - 哪些操作系统以及如何将页面固定在数据库缓冲池中?

c - 为什么头文件包含完整的代码实现?