请求详解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是占位符,会被后续的第一个参数内容替换。
具体到这段代码:
- 格式控制串是
"%s C preprocessor",其中的%s需要被第二个参数的字符串替换; - 第二个参数是
"%s C preprocessor",所以把格式串里的%s换成这个字符串; - 替换后得到的内容就是
"%s C preprocessor"加上格式串本身后续的" C preprocessor",也就是最终输出的%s C preprocessor C preprocessor。
内容的提问来源于stack exchange,提问作者sakshi monst
相关产品推荐
相关产品推荐

