首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 調試四大實用技巧:條件編譯、運行期開關、字符串化、斷言

     編輯:C++ 入門

技巧一:條件編譯調試標記

利用預處理器開關,編譯期完全移除調試代碼,零運行開銷。

#define DEBUG  // 發布版註釋掉或 #undef DEBUG

#ifdef DEBUG
    // 調試代碼:日志、檢查、統計...
    std::cout << "Debug: x = " << x << std::endl;
#endif

優點:發布版無痕;缺點:需重新編譯切換。

技巧二:運行期調試開關 (命令行控制)

無需重新編譯,通過命令行參數動態啟用/禁用調試。

bool debug = false;

int main(int argc, char* argv[]) {
    for (int i = 0; i < argc; ++i)
        if (std::string(argv[i]) == "--debug=on")
            debug = true;

    while (running) {
        if (debug) {
            // 調試代碼
        }
        // 正常邏輯
    }
}

適用於服務程序、長時間運行進程、CI/CD 環境動態排查。

技巧三:變量/表達式自動字符串化輸出

利用預處理器 # 運算符,自動將變量名轉為字符串,配合流輸出。

#define PR(x) std::cout << #x << " = " << (x) << '\n'

int value = 42;
PR(value);           // 輸出: value = 42
PR(value * 2 + 1);   // 輸出: value * 2 + 1 = 85

快速檢查變量值與表達式結果,無需手寫字符串字面量。

技巧四:C 標準斷言 assert

<cassert>ed 提供運行期契約檢查,失敗時輸出文件、行號、表達式並終止程序 (或觸發調試器)。

#include 

int main() {
    int i = 100;
    assert(i != 100); // 失敗:Assertion failed: i != 100, file main.cpp, line 10

    // 發布版禁用斷言:在 #include  **之前** 定義 NDEBUG
    // #define NDEBUG
    // #include 
}

關鍵:NDEBUG 必須在包含 <cassert>ed **之前** 定義,否則斷言代碼仍會編譯進去。

綜合建議

進階:自定義斷言宏

#ifdef NDEBUG
    #define MY_ASSERT(cond) ((void)0)
#else
    #define MY_ASSERT(cond) \
        do { \
            if (!(cond)) { \
                std::cerr << "ASSERT FAILED: " << #cond \
                          << " at " << __FILE__ << ":" << __LINE__ << std::endl; \
                std::abort(); \
            } \
        } while (0)
#endif

總結

組合使用這四大技巧:開發期用 #ifdef DEBUG + PR() 密集輸出,**提交前用 assert 固化關鍵契約**,**生產環境保留 --debug=on 運行期開關**應急排查。養成良好調試習慣,讓 Bug 無處遁形。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
技巧適用場景優點缺點
條件編譯開發期大量調試輸出發布版零開銷需重新編譯切換
運行期開關生產環境排查、服務程序無需重啟/重編譯發布版保留代碼(極小開銷)
字符串化宏快速打印變量/表達式代碼極少、自動同步名稱宏副作用風險(參數求值多次)
assert前置/後置條件、不變式檢查標準化、自動定位、可全局禁用釋放版失效、不適用可恢復錯誤