在程式遇到問題調試時,有時候需要列印一些中間變數,觀察完調試完又需要把這些列印註釋掉,感覺很麻煩。所以寫了一個小程式,可以設置列印日誌等級。 在主程式設置要列印的日誌等級debug,就把相應的等級的日誌全部打出來觀察。 程式用到了va_list(在C語言中解決變參問題的一組巨集),相關知識可參考htt ...
在程式遇到問題調試時,有時候需要列印一些中間變數,觀察完調試完又需要把這些列印註釋掉,感覺很麻煩。所以寫了一個小程式,可以設置列印日誌等級。
在主程式設置要列印的日誌等級debug,就把相應的等級的日誌全部打出來觀察。
程式用到了va_list(在C語言中解決變參問題的一組巨集),相關知識可參考http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html(註意鏈接文章正確的程式在評論中) 。
直接上主程式:main.cpp
1 #include"log.h" 2 #include<stdio.h> 3 int debug = 2; //10 為全打 1-9只打相應等級日誌 4 int main() 5 { 6 SetDebugLevel(); 7 char s[]="abc"; 8 int k = 7; 9 double kk = 11.5; 10 WriteLog(1 , "1-日誌是:%s\n" , "abc"); 11 WriteLog(2 , "2-日誌是:%s , k:%d\n" , s , k); //WriteLog(日誌等級,格式化字元串 ,不定個數的變數) 12 WriteLog(3 , "3-日誌是:%s , k:%d\n" , s , k); 13 WriteLog(4 , "4-日誌是:%s , k:%d\n" , s , k); 14 WriteLog(5 , "5-日誌是:%s , k:%d\n" , s , k); //debug為5 , 則只列印這一條。 15 WriteLog(6 , "6-日誌是:%s , k:%d , kk = %lf\n" , s , k , kk); 16 printf("\n"); 17 return 0; 18 }
日誌列印等級debug為2,則只列印第11行。
日誌列印等級debug為6,則只列印第15行。
日誌列印等級debug為10,則全部列印。
日誌列印等級為0(非1-10) , 則不做任何列印(指調用WriteLog的列印)。
調用的程式直接貼代碼:
log.h
1 void WriteLog(int , char * ,... ); 2 void SetDebugLevel();
具體實現代碼:
log.cpp
1 #include<stdio.h> 2 #include <stdarg.h> 3 4 extern int debug; 5 int debug_flag = 0; 6 void WriteLog(int i,va_list va_alist,...) 7 { 8 va_list args; 9 int level = i; 10 va_start(args ,va_alist); 11 if(debug_flag & 1 << (level - 1)) //註意&和<<優先順序 12 { 13 vfprintf(stderr, va_alist, args); 14 } 15 va_end(args); 16 } 17 void SetDebugLevel() 18 { 19 if (debug >= 1 && debug <= 9) 20 { 21 debug_flag |= 1 << (debug-1); 22 } 23 else if(debug == 10) 24 { 25 debug_flag = 255; 26 } 27 }
至此,第一篇隨筆結束。希望多多有意義的指教。