我想定义一个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);
答案 0 :(得分:3)
以下是一些错误:
fopen
无效标准C. #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
然而,这是一些非常难看的代码。如果必须,您应该用函数替换它并在运行时连接格式字符串。
总的来说,应尽可能避免使用变量参数函数或宏。它们不仅丑陋而且非常危险。变量参数的存在通常是程序设计不佳的一个非常强烈的迹象。