如何在C/C++宏定义开头实现Token粘贴且不展开参数
问题根因
你出现报错的核心原因是违反了C/C++预处理器的##运算符使用规则:##是Token粘贴运算符,必须放在两个合法的预处理Token之间。
你写的APPEND_TOKEN(##a, ##b)会让预处理器尝试把左括号(和参数a的取值VAR拼接为(VAR,把逗号,和参数b的取值iable拼接为,iable,这两个都不是合法的预处理Token,因此触发了对应报错。
正确实现方案
你的核心需求是两个:
- 拼接两个参数为单个Token,比如
JOIN_TOKENS(Up, Here)输出UpHere - 拼接前不展开参数本身,比如传入已经定义为宏的
VAR时,不会被展开为0,最终得到VARiable
这个需求直接用单层##拼接即可实现,因为预处理器有明确规则:作为#或##运算符的操作数的宏参数,不会被预展开。
正确的宏定义如下:
#define JOIN_TOKENS(a, b) a##b
效果验证
用你的测试场景验证:
#define VAR 0 #define JOIN_TOKENS(a, b) a##b // 展开结果为 VARiable,完全符合预期,无编译错误 JOIN_TOKENS(VAR, iable)
补充说明
如果你后续有「先展开参数再拼接」的需求,可以嵌套两层宏实现:
// 先展开参数,再执行拼接 #define JOIN_TOKENS_EXPAND(a, b) JOIN_TOKENS(a, b) // 例子:JOIN_TOKENS_EXPAND(VAR, iable) 会先把VAR展开为0,最终得到 0iable
内容的提问来源于stack exchange,提问作者Melab
相关产品推荐
相关产品推荐

