簡體   English   中英

如何在調試模式下打印程序中發生的事情

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM