本篇介紹在 C/C++ 下使用 printf 來 debug 的一些技巧,
Gist
https://stackoverflow.com/questions/1941307/c-debug-print-macros
最簡單的
1
| #define DEBUG_PRINT(fmt, ...) printf("[DEBUG] %s, %s(), line:%d, msg:" fmt, __FILE__, __func__, __LINE__, ##__VA_ARGS__)
|
Tom Kuschel 的版本
1 2 3 4 5 6 7 8
| #define DEBUG 3
#if defined(DEBUG) && DEBUG > 0 #define DEBUG_PRINT(fmt, ...) fprintf(stderr, "[DEBUG] %s:%d:%s(): " fmt, \ __FILE__, __LINE__, __func__, ##__VA_ARGS__) #else #define DEBUG_PRINT(fmt, ...) #endif
|
以下為我的版本, DEBUG 可以定義不同數字等級, 決定輸出的訊息種類.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #define DEBUG 4 #if defined(DEBUG) #if DEBUG >= 4 #define DEBUG_PRINT(fmt, ...) fprintf(stderr, "[DEBUG] %s:%s():%d " fmt, \ __FILE__, __func__, __LINE__, ##__VA_ARGS__) #elif DEBUG >= 3 #define DEBUG_PRINT(fmt, ...) fprintf(stderr, "[DEBUG] %s:%s() " fmt, \ __FILE__, __func__, ##__VA_ARGS__) #elif DEBUG >= 2 #define DEBUG_PRINT(fmt, ...) fprintf(stderr, "[DEBUG] %s:%d " fmt, \ __FILE__, __LINE__, __func__, ##__VA_ARGS__) #elif DEBUG >= 1 #define DEBUG_PRINT(fmt, ...) fprintf(stderr, "[DEBUG] %s():%d " fmt, \ __func__, __LINE__, ##__VA_ARGS__) #endif #else #define DEBUG_PRINT(fmt, ...) #endif
|
使用
1 2
| DEBUG_PRINT("Debugging is enabled.\n"); DEBUG_PRINT("Debug level: %d", (int) DEBUG);
|
20180220 updated: libusbmuxd 另一種用法
20190409 updated: 新增顯示檔名
1 2 3 4 5
| #include <string.h>
#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
#define DRBUG_PRINT(fmt, ...) do { fprintf(stderr, "[DEBUG] %s() %s:%d " fmt, __FUNCTION__, __FILENAME__, __LINE__, ##__VA_ARGS__); } while(0)
|
其它相關文章推薦
C/C++ 新手入門教學懶人包