我想在调试模式下打印程序中发生的事情,但在发布时不应打印任何内容以免浪费性能。我的程序是 C++
我想查看打印内容的颜色。例如,如果发生了我知道会导致重大错误的事情,我想打印一个红色的大警告来描述发生的事情,然后关闭程序。
有图书馆吗?我应该怎么做才能仅在调试模式下执行它?
答案 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