如何用两个宏替代多个ARG_N宏实现按size调用不同函数?
仅用两个宏实现按size分支调用函数
当然可以,完全不用定义一堆ARG_N宏。利用C预处理器的条件编译能力,或者结合运行时判断,只靠ARG_ONE和ARG_NOT_ONE两个宏就能实现需求,分两种场景说明:
场景1:size是编译期常量
如果传入MY_MACRO的size是编译时就能确定的常量(比如字面量、宏定义的数值),可以直接用预处理器的#if分支完成选择:
// 定义目标函数的别名宏 #define ARG_ONE fun_size_one #define ARG_NOT_ONE fun_size_not_one // 核心宏:根据编译期size值选择调用对应函数 #define MY_MACRO(size) \ do { \ #if (size == 1) \ ARG_ONE(); \ #else \ ARG_NOT_ONE(); \ #endif \ } while(0)
使用示例:
MY_MACRO(1); // 预编译后直接展开为 fun_size_one(); MY_MACRO(5); // 预编译后展开为 fun_size_not_one(); MY_MACRO(100); // 同样展开为 fun_size_not_one();
这种写法在预编译阶段就完成了分支选择,最终生成的代码没有多余判断逻辑,效率和原枚举式写法一致,但无需逐个定义ARG_N宏。
场景2:size是运行时变量
如果size是只有运行时才能确定的变量(比如函数参数、用户输入值),预处理器无法处理,直接用运行时if-else判断即可,依然只需要两个宏:
#define ARG_ONE fun_size_one #define ARG_NOT_ONE fun_size_not_one #define MY_MACRO(size) \ do { \ if ((size) == 1) { \ ARG_ONE(); \ } else { \ ARG_NOT_ONE(); \ } \ } while(0)
使用示例:
int input_size = get_user_input(); MY_MACRO(input_size); // 运行时根据input_size的值选择调用函数
原写法需要大量ARG_N宏的原因
原来的思路是把每个可能的size值单独映射到一个ARG_N宏,本质是枚举所有可能的size值,不仅繁琐还容易遗漏未定义的size值。而上面的写法是通过条件逻辑判断直接区分size是否为1,从枚举转向逻辑判断,自然不需要定义大量宏。
内容的提问来源于stack exchange,提问作者yyd
相关产品推荐
相关产品推荐

