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

C++ PRINT宏展开疑问:为何str未被当作%s的首个占位值?

关于C++ PRINT宏的两个技术疑问解答

原始宏定义与调用示例

宏定义

#define PRINT(str,...) printf("%s:%d "  str, __FUNCTION__, __LINE__, ##__VA_ARGS__)

调用示例

13 void func(){
14    PRINT("Hello %s", "World");
15 }

输出结果:func:14 Hello World

问题1:为何宏中的str未被当作printf第一个%s占位符的对应值?

这是因为C/C++有个特性:相邻的字符串字面量会自动拼接。只要两个字符串字面量之间没有其他符号(哪怕只隔空格),编译器就会把它们合并成一个完整的字符串。

在这个宏里,"%s:%d " 和传入的str(也就是"Hello %s")会被拼接成"%s:%d Hello %s",这才是最终传给printf的格式字符串。所以printf的第一个%s对应后面的__FUNCTION__(即函数名"func"),%d对应__LINE__(行号14),最后一个%s对应"World"——从始至终,str都只是格式字符串的一部分,根本不是占位符的参数。

问题2:该示例中PRINT宏的具体展开过程是怎样的?

宏展开是预处理阶段的纯文本替换操作,步骤如下:

  1. 替换宏的普通参数:把str替换成调用时传入的"Hello %s",##__VA_ARGS__替换成可变参数"World";
  2. 处理字符串拼接:将"%s:%d " 和 "Hello %s" 合并为一个完整的格式字符串"%s:%d Hello %s";
  3. 替换预定义宏:__FUNCTION__被替换为当前函数名"func",__LINE__被替换为当前行号14;

最终展开后的代码是:

printf("%s:%d Hello %s", "func", 14, "World");

执行这行代码就会输出示例里的结果func:14 Hello World。

内容的提问来源于stack exchange,提问作者Sazzad Hissain Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 00:52:13