写程序的时候,输出调试信息是非常重要。在C中,我们常常使用printf,而在C++中,标准的用法是cout的了。有些比较老道的做法是加个DEBUG宏,比如:
#ifdef __DEBUG__
printf("hello world") ;
#endif
这个办法在早期时候,用的比较多,他很容易将__DEBUG__宏去掉,就不用输出非常多的信息。但很显然,每个地方都要写很多代码。而且需要编译成DEBUG和REALSE版本。
另外一个改进型的方式就是使用函数封装他,不再使用宏,而是使用配置参数来控制是否需输出调试信息,比如:
static int debug_out_level = 0 ;
void debug_out(int level , const char *format , ...)
{
va_list _arg ;
char _msg[8192] = {0} ;
va_start(_arg , format) ;
vsprintf(_msg , format , _arg) ;
va_end(_arg) ;
if(level < debug_out_leve)
printf("%s" , _msg) ;
}
由于debug_out_level是变量,我们可以很容易的控制他的值,这样,就可以控制printf是否被执行。
上面的方法很不错,但是实际上,我们有时候还需要更详细的信息,比如__FILE__,__LINE__的信息,或者当前时间等。这些信息最好不要让用户来产生,让用户依然按他们的习惯输出。
/***********************************************************************
debug.h
***********************************************************************/
#ifndef __DEBUG_H
#define __DEBUG_H 1
extern void debug_out(int level , int msgno , const char *filename , int line , const char *format , ...) ;
#define DEBUG_OUT(level , msgno , ...) debug_out(level , msgno , __FILE__ , __LINE__ , __VA_ARGS__)
#endif
/***********************************************************************
debug.c
***********************************************************************/
#include "debug.h"
void debug_out(int level , int msgno , const char *filename , int line , const char *format , ...)
{
...
}
DEBUG_OUT可以按照用户原来的习惯,__FILE__,__LINE__被屏蔽掉了。也许那天我们再增加个参数,也不用让用户修改DEBUG_OUT的用法。
系统日志的编写技巧
最新推荐文章于 2021-11-03 18:32:22 发布