#include <stdio.h>
#define logD(fmt, ...) \
fprintf(stdout, "[\e[34m debug \e[0m] %s:%02d --> ", __FILE__, __LINE__); fprintf(stdout, fmt, ##__VA_ARGS__);
#define logE(fmt, ...) \
fprintf(stderr, "[\e[31m error \e[0m] %s:%02d --> ", __FILE__, __LINE__); fprintf(stderr, fmt, ##__VA_ARGS__);
int main(){
logD("%s\n", "here is debugging information");
logE("%s %d %s\n", "error info", 123, "args");
logD("如果不加##,此行編譯不過~\n");
return 0;
}
效果:
說明:
參考: 侵蝕昨天
- #,把參數轉換成字符串
#define P(x) printf("%s:%d\n",#x,x);
int a = 1, b = 2;
p(a + b); // 輸出:a + b:3
- ##,用於符號的連接
#define XNAME(n) x##n
int x3 = 3;
cout << XNAME(3); // 輸出:3
P(XNAME(3)); // 輸出:XNAME(3):3
- __VA_ARGS__, 是C99標準可變參數的宏,相當於可變參數函數中的省略號。
- ##__VA_ARGS__ ,若不加##,當可變參數爲0時,宏展開會多一個逗號,導致編譯錯誤,##就是爲了解決這個問題。
- __FILE__,宏展開時會替換成當前文件名。
- __LINE__,宏展開時會替換成當前行號。
- 終端顏色代碼,
\e[30m 內容 \e[0m
,\e[xm
成對出現,開頭數字表示顏色,結尾數字表示顯示效果。
顏色:
顯示效果:
0無效果 1粗體 4下劃線 5閃爍 7反轉 8隱藏 - stdout, stderr,終端重定向時,
stderr
依舊輸出到屏幕。