如何在调试模式下打印程序中发生的事情

时间:2021-07-13 15:31:56

标签: c++ error-handling

我想在调试模式下打印程序中发生的事情,但在发布时不应打印任何内容以免浪费性能。我的程序是 C++

我想查看打印内容的颜色。例如,如果发生了我知道会导致重大错误的事情,我想打印一个红色的大警告来描述发生的事情,然后关闭程序。

有图书馆吗?我应该怎么做才能仅在调试模式下执行它?

2 个答案:

答案 0 :(得分:3)

最接近“标准”机制的是使用 NDEBUG 宏,它驱动 assert() 的行为。

#ifndef NDEBUG
std::cerr << "I only print in debug\n";
#endif

大多数构建系统(如 CMake)在创建发布构建时都会定义 NDEBUG,因此在这些情况下无需额外工作。

如果是直接调用编译器,那么需要手动定义。无论如何,您几乎肯定应该已经为发布版本执行此操作:

g++ -DNDEBUG -O3 main.cpp

但是,到处散布 #ifndef 块在较大的代码库中往往不能很好地扩展,因此大多数非平凡的项目都会将条件编译作为日志记录/跟踪系统的一部分。

一个简单的版本大概是这样的:

#include <iostream>

#ifdef NDEBUG
  namespace my_project::details {
    struct null_sink {
      template<typename T>
      null_sink& operator<<(const T&) {return *this;}
    };
  }
  #define DEBUG_PRINT my_project::details::null_sink{}
#else
  #define DEBUG_PRINT std::cerr
#endif

void foo() {
  DEBUG_PRINT << "only in debug\n";
}

答案 1 :(得分:0)

尽管@Frank 的回答对我帮助很大,但我还是找到了一个日志库,可以在 this github page 上满足我的需求。该库名为 spdlog。

我可以用颜色、时间和所需参数记录正在发生的事情。

我们可以将此解决方案与@frank 的答案合并以获得非常好的日志记录:

#ifndef NDEBUG
spdlog::warn("you are making a big mistake because of...")
#endif

将返回: enter image description here