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; }
可以加入檔名、行號之類的輸出,這樣會更加清晰。