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

C预处理器宏参数替换规则疑问:两次宏调用为何输出不同?

C预处理器宏展开差异问题解析

情况1:直接调用f1宏

#define mytype __mytype
#define f1(in)\
  call##in
f1(mytype)

执行gcc -E file.c后输出:callmytype

情况2:通过f2间接调用f1宏

#define mytype __mytype
#define f1(in)\
  call##in
#define f2(in)\
  f1(in)
f2(mytype)

输出为:call__mytype

问题解答

你的理解不完全准确,核心原因是预处理器的宏展开规则中,##连接符会抑制其参数的宏替换,而间接调用时参数会先完成替换再传入。

具体拆解:

  • 直接调用f1(mytype)时,##属于预处理运算符,它会阻止参数mytype被展开成__mytype,直接将call和mytype拼接,得到callmytype。
  • 间接调用f2(mytype)时,f2的参数mytype没有被##抑制,会先展开为__mytype,再将展开后的结果传入f1,此时f1将call和__mytype拼接,得到call__mytype。

简言之:宏参数在遇到##或#(字符串化运算符)时,不会先展开;但如果通过外层宏传递,外层宏无这类运算符,参数会先展开再传递给内层宏。

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:09:59