You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让C预处理器根据参数类型生成差异化代码?

GCC预处理器宏实现条件化代码生成

现有宏定义

// M(_slot_name, _type, _arg, _accessor)
#define DEFINE_SLOTS(M) \
  M(ENABLE_A, bool, ENABLE_A_BITPOS, registry_enable_a) \
  M(SLEEP_TIME, uint32_t, sleep_time, registry_sleep_time) \
  M(ENABLE_B, bool, ENABLE_B_BITPOS, registry_enable_b) \
  M(WAKE_TIME, uint32_t, wake_time, registry_wake_time)

1. 全slot枚举(已掌握,快速实现)

直接通过枚举生成宏提取_slot_name:

#define GEN_SLOT_ENUM(_slot_name, _type, _arg, _accessor) _slot_name,
typedef enum {
  DEFINE_SLOTS(GEN_SLOT_ENUM)
} slot_id_t;

2. 仅bool类型的bitpos枚举

利用宏拼接(##)针对不同类型做条件输出,只保留bool类型对应的_arg:

// 宏拼接工具
#define _GLUE(a, b) a##b

// bool类型输出对应_bitpos,其他类型空实现
#define GEN_BITPOS_bool(arg) arg,
#define GEN_BITPOS_uint32_t(arg)

// 统一调用入口
#define GEN_BITPOS_ENUM(_slot_name, _type, _arg, _accessor) \
  _GLUE(GEN_BITPOS_, _type)(_arg)

// 生成枚举
typedef enum {
  DEFINE_SLOTS(GEN_BITPOS_ENUM)
} bitpos_t;

注:如果GCC报末尾逗号警告,可添加-Wno-missing-field-initializers编译选项忽略,或者在枚举最后加一个占位项(如BITPOS_LAST)。


3. 按类型生成差异化访问函数

用宏拼接实现类型分支,为bool和uint32_t分别生成不同函数体:

// 宏拼接工具
#define _GLUE(a, b) a##b

// bool类型函数体:调用foo(_arg)
#define GEN_FUNC_BODY_bool(arg) return foo(arg);
// uint32_t类型函数体:访问bar->_arg
#define GEN_FUNC_BODY_uint32_t(arg) return bar->arg;

// 生成完整函数定义
#define GEN_ACCESSOR_FUNC(_slot_name, _type, _arg, _accessor) \
  _type _accessor(void) { \
    _GLUE(GEN_FUNC_BODY_, _type)(_arg); \
  }

// 批量生成所有访问函数
DEFINE_SLOTS(GEN_ACCESSOR_FUNC)

内容的提问来源于stack exchange,提问作者fearless_fool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:25:25