【问题标题】:How I can custom fprintf for enable disable我如何自定义 fprintf 以启用禁用
【发布时间】:2019-10-04 00:55:18
【问题描述】:

我想自定义fprintf 函数以启用/禁用日志记录

我的项目使用 Makefile。

#define ENABLE_LOG 
void log(fmt, ...){
  #ifdef ENABLE_LOG
    va_list vargs;
    va_start(vargs, fmt);
    fprintf(stderr, vargs);
    va_end(vargs);
  #endif
}

log("Test"); # build error
log("TEST %d", 1); # build error

如何创建自定义 log 函数,该函数可以使用 ENABLE_LOG 启用/禁用

【问题讨论】:

标签: c++ debugging


【解决方案1】:

您需要使用vfprintf()。另外,我会创建一个空宏来避免调用空函数。

#define ENABLE_LOG 
#ifdef ENABLE_LOG
void log(const char *fmt, ...) {
    va_list vargs;
    va_start(vargs, fmt);
    vfprintf(stderr, fmt, vargs);
    va_end(vargs);
}
#else
#define log(fmt, ...)
#endif

另外,请注意已经有一个名为 log 的 C++ 函数。您可能会考虑使用不同的名称(特别是如果您使用可怕的 using namespace std; - 即使您的代码看起来像纯 C。)

【讨论】:

  • 空宏是一件危险的事情。最好让它成为一个空表达式:#define log(fmt, ...) (void)(0)
  • @IgorG 我没听说过。是什么让它变得危险?
  • 不可预测的使用场景。如果将非空标记序列替换为空标记序列,则某些代码可能会损坏(或以不同方式解释)。例如,如果某个客户端程序员想要在计算表达式时记录他的表达式,他可能有#define LOGGED(expr) (log("Evaluating " #expr), (expr))。如果log() 为空,它将扩展为无效表达式(, (expr))。我承认,这个例子相当奇特。但是,为了安全起见,最好让 log() 始终扩展为相同的类型。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多