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; }
关键改动说明
- 新增
FUNCTION_NAME宏直接返回__FUNCTION__字符串字面量,作为打印的数据源。 PRINT_INFO()保持原有的直接打印函数名的功能,内部用FUNCTION_NAME提供字符串。PRINT宏里直接使用FUNCTION_NAME作为printf的第一个参数,和传入的格式串拼接("%s " str),格式串与参数完全匹配:%s对应FUNCTION_NAME(函数名字符串)- 后续格式符对应传入的可变参数
运行验证
编译运行修正后的代码,会得到预期输出:
main main Hello World
内容的提问来源于stack exchange,提问作者Sazzad Hissain Khan
相关产品推荐
相关产品推荐

