如何让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
相关产品推荐
相关产品推荐

