如何基于宏的布尔参数为生成的函数名添加可选后缀?
如何基于宏的布尔参数为生成的函数名添加可选后缀?
嗨,这个需求我之前也折腾过,C预处理器的宏拼接确实得注意展开顺序,不然很容易踩坑。给你一个能完美实现你需求的方案:
首先,我们需要借助几层辅助宏来实现“根据布尔参数选择后缀”的逻辑,因为直接拼接的话,预处理器不会先展开你的布尔参数,会直接把宏名拼上去,达不到效果。
完整实现代码
// 定义对应布尔值的后缀:true时返回下划线,false时返回空 #define _SUFFIX_TRUE _ #define _SUFFIX_FALSE // 根据传入的布尔参数,选择对应的后缀宏 #define _GET_SUFFIX(cond) _SUFFIX_##cond // 间接展开宏,确保传入的cond先被替换成true/false,再去匹配后缀宏 #define MAYBE_SHOW_SUFFIX(cond) _GET_SUFFIX(cond) // 最终的函数名生成宏:需要一层中间宏来让后缀先展开,再和原函数名拼接 #define _FUNC_NAME_HELPER(name, suffix) name##suffix #define FUNC_NAME(name, hasSuffix) _FUNC_NAME_HELPER(name, MAYBE_SHOW_SUFFIX(hasSuffix))
测试效果
当你调用:
FUNC_NAME(foo, true); // 会展开成:foo_ FUNC_NAME(foo, false); // 会展开成:foo
为啥要这么多层宏?
这里的关键是预处理器的展开顺序:
- 如果直接写
name##MAYBE_SHOW_SUFFIX(hasSuffix),预处理器会直接把name和MAYBE_SHOW_SUFFIX(hasSuffix)拼在一起,不会先展开MAYBE_SHOW_SUFFIX。 - 加一层
_FUNC_NAME_HELPER中间宏后,预处理器会先展开MAYBE_SHOW_SUFFIX(hasSuffix)得到对应的后缀(要么是_要么是空),再把name和展开后的后缀拼接,这样就得到了我们想要的结果。
额外小提示
如果你习惯用C标准的1和0来表示布尔值(毕竟true和false是C99才引入的),可以把辅助宏改成这样:
#define _SUFFIX_1 _ #define _SUFFIX_0
这样调用FUNC_NAME(foo, 1)和FUNC_NAME(foo, 0)也能得到同样的效果,兼容性更好。
备注:内容来源于stack exchange,提问作者Dess
相关产品推荐
相关产品推荐

