gpt4 book ai didi

c - printf 宏导致段错误

转载 作者:行者123 更新时间:2023-11-30 20:04:14 24 4
gpt4 key购买 nike

我想定义一个宏来执行“在控制台上打印并写入文件”。下面是我的代码,有人可以告诉我为什么它会导致“段错误(核心转储)”。

#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);

最佳答案

以下是一些错误:

  • TRC_DP(fmt, args...) 不是有效的标准 C。
  • The icky do-while(0) trick假设没有尾随分号。
  • 您必须始终检查 fopen 是否成功。

这样的事情可能会解决问题:

#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)

但是,这是一些非常丑陋的代码。如果必须的话,您应该将其替换为函数并在运行时连接格式字符串。

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

关于c - printf 宏导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42830423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com