如何在调试模式下打印我的程序中发生的事情
How can I print what is happening in my program in debug mode
我想在调试模式下打印我的程序中发生的事情,但在发布时不应打印任何内容,以免浪费性能。我的程序是 C++
我想看看印刷品的颜色。例如,如果发生了我知道会导致重大错误的事情,我想在描述发生的事情的地方打印一个大的红色警告,然后关闭程序。
有图书馆吗?我应该怎么做才能只在调试模式下执行它?
最接近“标准”机制的是使用 NDEBUG
宏,它驱动 assert()
.
的行为
#ifndef NDEBUG
std::cerr << "I only print in debug\n";
#endif
大多数构建系统(如 CMake)都会在创建发布构建时定义 NDEBUG
,因此在这些情况下无需执行额外的工作。
如果是直接调用编译器,则需要手动定义。无论如何,您几乎肯定应该已经为发布版本这样做了:
g++ -DNDEBUG -O3 main.cpp
然而,在较大的代码库中到处散布 #ifndef
块往往无法很好地扩展,因此大多数重要的项目都会将条件编译作为 logging/tracing 系统的一部分.
它的一个简单版本大致如下所示:
#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";
}
尽管@Frank 的回答对我帮助很大,但我在 this github page 上找到了一个可以满足我需要的日志记录库。这个库被命名为 spdlog。
我可以记录颜色、时间和所需参数的变化。
我们可以将此解决方案与@frank 的答案合并以获得非常好的日志记录:
#ifndef NDEBUG
spdlog::warn("you are making a big mistake because of...")
#endif
将 return :
我想在调试模式下打印我的程序中发生的事情,但在发布时不应打印任何内容,以免浪费性能。我的程序是 C++
我想看看印刷品的颜色。例如,如果发生了我知道会导致重大错误的事情,我想在描述发生的事情的地方打印一个大的红色警告,然后关闭程序。
有图书馆吗?我应该怎么做才能只在调试模式下执行它?
最接近“标准”机制的是使用 NDEBUG
宏,它驱动 assert()
.
#ifndef NDEBUG
std::cerr << "I only print in debug\n";
#endif
大多数构建系统(如 CMake)都会在创建发布构建时定义 NDEBUG
,因此在这些情况下无需执行额外的工作。
如果是直接调用编译器,则需要手动定义。无论如何,您几乎肯定应该已经为发布版本这样做了:
g++ -DNDEBUG -O3 main.cpp
然而,在较大的代码库中到处散布 #ifndef
块往往无法很好地扩展,因此大多数重要的项目都会将条件编译作为 logging/tracing 系统的一部分.
它的一个简单版本大致如下所示:
#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";
}
尽管@Frank 的回答对我帮助很大,但我在 this github page 上找到了一个可以满足我需要的日志记录库。这个库被命名为 spdlog。
我可以记录颜色、时间和所需参数的变化。
我们可以将此解决方案与@frank 的答案合并以获得非常好的日志记录:
#ifndef NDEBUG
spdlog::warn("you are making a big mistake because of...")
#endif
将 return :