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

C++宏展开与拼接问题:PRINT宏触发段错误如何修复?

问题分析与解决方案

错误原因

你的代码触发段错误(信号11)的核心原因是宏的用法逻辑错误:

  • PRINT_INFO() 宏本身是直接调用 printf 打印函数名,它的返回值是打印的字符数(int 类型)。
  • 但你在 PRINT 宏里把 PRINT_INFO() 作为 printf 的参数传给了 %s 格式符,printf 会把这个 int 值当作内存地址去读取字符串,这必然导致非法内存访问,触发段错误。

正确实现方式

我们需要让函数名字符串直接作为 printf 的参数,而不是把一个执行打印操作的宏塞进去。可以拆分宏职责:

修正后的完整代码

#include <stdio.h>  // 原代码漏了stdio.h,printf依赖该头文件

#define FUNCTION_NAME __FUNCTION__
#define PRINT_INFO() printf("%s", FUNCTION_NAME)
#define PRINT(str, ...) printf("%s " str, FUNCTION_NAME, ##__VA_ARGS__)

int main() {
    PRINT_INFO();  // 输出:main
    PRINT("Hello %s", "World");  // 输出:main Hello World
    return 0;
}

关键改动说明

  1. 新增 FUNCTION_NAME 宏直接返回 __FUNCTION__ 字符串字面量,作为打印的数据源。
  2. PRINT_INFO() 保持原有的直接打印函数名的功能,内部用 FUNCTION_NAME 提供字符串。
  3. PRINT 宏里直接使用 FUNCTION_NAME 作为 printf 的第一个参数,和传入的格式串拼接("%s " str),格式串与参数完全匹配:
    • %s 对应 FUNCTION_NAME(函数名字符串)
    • 后续格式符对应传入的可变参数

运行验证

编译运行修正后的代码,会得到预期输出:

main
main 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.26 21:12:23