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

C语言宏定义中为何需使用##粘贴运算符而非直接拼接标识符?

C语言宏参数拼接为什么必须使用##运算符

核心原因和C预处理器的token(令牌)识别规则直接相关:

  • 预处理器处理宏替换时,只会替换完全独立的token(可理解为语法层面的独立语义单元,变量名、关键字、运算符都属于单独的token),不会拆分一个已有token的子串来匹配宏参数。
    如果你把宏定义直接写为#define f(g,g2) gg2,预处理器会把gg2识别为一个完整的标识符token,不会把开头的g匹配为第一个宏参数,也不会把后面的g2匹配为第二个宏参数。此时调用f(var,12)的展开结果就是字面量gg2,而不是你预期的var12,因为代码中没有定义名为gg2的变量,编译会直接报错。
  • ##是C标准规定的预处理器令牌拼接运算符,它的作用就是显式告诉预处理器:先完成左右两侧的宏参数替换,再把两个替换后的结果拼接为一个新的token,才能实现参数拼接的需求。

内容的提问来源于stack exchange,提问作者Ait-Gacem Nabil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:06:04