在程序遇到问题调试时,有时候需要打印一些中间变量,观察完调试完又需要把这些打印注释掉,感觉很麻烦。所以写了一个小程序,可以设置打印日志等级。
在主程序设置要打印的日志等级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 }
至此,第一篇随笔结束。希望多多有意义的指教。
时间: 2024-10-19 08:04:01