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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:24:02