[英]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)在創建 Release 構建時都會定義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";
}
盡管@Frank 的回答對我幫助很大,但我在這個 github 頁面上找到了一個可以滿足我需要的日志庫。 該庫名為 spdlog。
我可以用顏色、時間和所需參數記錄正在發生的事情。
我們可以將此解決方案與@frank 的答案合並以獲得非常好的日志記錄:
#ifndef NDEBUG
spdlog::warn("you are making a big mistake because of...")
#endif
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.