漲姿勢系列:花裏胡哨調試信息

#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依舊輸出到屏幕。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章