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

请求详解C语言中该宏的工作机制及对应输出逻辑

详解这段C语言宏替换与输出逻辑

先看你给出的代码:

#include <stdio.h>
#define puts "%s C preprocessor"
int main()
{
    printf(puts, puts);
    return 0;
}

运行输出结果:

%s C preprocessor C preprocessor

第一步:预处理器的文本替换

C语言的#define是纯文本替换,在编译前的预处理阶段就会执行——它不管替换后的内容是什么,只是把代码里所有匹配puts的标识符,原封不动换成"%s C preprocessor"。

这里要注意:你定义的puts覆盖了标准库的puts函数名,但这段代码里没调用标准库的puts,所以不会出问题。

经过预处理后,main里的printf(puts, puts);会被替换成:

printf("%s C preprocessor", "%s C preprocessor");

第二步:printf的输出规则

printf的第一个参数是格式控制串,里面的%s是占位符,会被后续的第一个参数内容替换。

具体到这段代码:

  1. 格式控制串是"%s C preprocessor",其中的%s需要被第二个参数的字符串替换;
  2. 第二个参数是"%s C preprocessor",所以把格式串里的%s换成这个字符串;
  3. 替换后得到的内容就是"%s C preprocessor"加上格式串本身后续的" C preprocessor",也就是最终输出的%s C preprocessor C preprocessor。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:15:33