printf的宏导致分段错误

时间:2017-03-16 09:47:31

标签: c debugging

我想定义一个marco来做“在控制台上打印并写入文件”。 下面是我的代码,可能有人告诉我为什么它会导致“Segmentation fault(core dumped)”。

#define TRC_DP(fmt, args...)  \
do {\
    FILE * fp = fopen("/home/debug.log","a+");\
    fprintf(fp,"TRC_DP(%s:%d):\t" fmt, __func__, __LINE__, ##args);\
    printf(fmt, ##args);\
    fclose(fp);\
}while(0);

1 个答案:

答案 0 :(得分:3)

以下是一些错误:

  • fopen无效标准C.
  • The icky do-while(0) trick假设没有尾随的分号。
  • 您必须始终检查#define TRC_DP(fmt, ...) \ do {\ FILE * fp = fopen("/home/debug.log","a+");\ if(fp != NULL) { \ fprintf(fp,"TRC_DP(%s:%d):\t" fmt, __func__, __LINE__, __VA_ARGS__); \ printf(fmt, __VA_ARGS__);\ fclose(fp);\ } \ }while(0) 是否成功。

这样的事情可以解决问题:

sqlplus

然而,这是一些非常难看的代码。如果必须,您应该用函数替换它并在运行时连接格式字符串。

总的来说,应尽可能避免使用变量参数函数或宏。它们不仅丑陋而且非常危险。变量参数的存在通常是程序设计不佳的一个非常强烈的迹象。