C++簡單日誌/debug除錯資訊輸出

Gold_stein發表於2024-09-04

C++簡單日誌/debug除錯資訊輸出

在寫一些簡單的小專案,或者演算法題的時候,沒有必要使用spdlog、log4cpp這樣專門的日誌庫,但是如果把所有的除錯語句都用

#ifdef DEBUG
...
#endif

這樣的語句塊包圍,就太麻煩了,我們可以用一個宏/函式來替代這些每處都不得不插入的語句塊。

1.最簡單的宏

#ifdef DEBUG
#define DEBUG_LOG(x) std::cout << x << std::endl;
#else
#define DEBUG_LOG(x)
#endif

只能輸出最簡單的資訊

DEBUG_LOG("This is a debug message");

2.類似的C++寫法

#include <iostream>

#ifdef DEBUG
#define DEBUG_STREAM std::cout
#else
#define DEBUG_STREAM if (false) std::cout
#endif

這種寫法更加靈活,能夠輸出更多資訊

DEBUG_STREAM << "Debug information" << std::endl;

3.行內函數

inline void debug_log(const std::string& msg) {
#ifdef DEBUG
    std::cout << msg << std::endl;
#endif
}

雖然看起來更高階,但是它的用法和第一種一樣十分受限

debug_log("This is a debug message");

4.對2.的純C實現

#include <stdio.h>
#include <stdarg.h>

// 定義一個除錯輸出的宏
#ifdef DEBUG
    #define DEBUG_LOG(fmt, ...) \
        do { \
            fprintf(stderr, "DEBUG: " fmt "\n", ##__VA_ARGS__); \
        } while (0)
#else
    #define DEBUG_LOG(fmt, ...) \
        do { } while (0)
#endif

int main() {
    int x = 42;
    const char* str = "example";

    // 使用除錯宏
    DEBUG_LOG("This is a debug message");
    DEBUG_LOG("Value of x: %d", x);
    DEBUG_LOG("This is a string: %s", str);

    return 0;
}

可以加入檔名、行號之類的輸出,這樣會更加清晰。

相關文章