printf、fprintf变参函数封装

来源:互联网 发布:奥飞数据 股票 编辑:程序博客网 时间:2024/05/16 10:20
       WINCE下开发的时候,为了方便调试,需要通过串口输出调试信息或者将调试信息已日志形式写入到文件。我们首先想到的的直接调用printf和fprintf输出调试信息和写文件。但这样存在的弊端是不利于编译控制,因为在出版本的时候我们一般是不需要输出或生成这些调试信息的,这就需要能够方便的对是否输出或生成调试信息进行控制,最好的方法是对printf用宏定义方式重新定义,然后定义打印开关确定是否调用printf打印调试信息,最后可以调整代码如下所示:
#define DBG_PRINT // 调试输出开关#ifdef DBG_PRINT#define dbgprt(fmt,...)  do{printf("DBG-PRINT:");printf(fmt,##__VA_ARGS__);}while(0)#else#define dbgprt(fmt,...) #endif

       对于写日志信息到文件,也可以将fprintf的封装成类似于printf函数一样的接口,这样在需要输出调试信息的时候就会很方便的调用了。以下通过对fprintf封装重新定义了一套输出调试信息到文件接口。

/********************************************************************created:2011-09-26author:firehood*********************************************************************///////////////////////////////////////////////////////////////////////#include <stdarg.h>//////////////////////////////////////////////////////////////////////#define PRINT_LOG  // 打印输出开关#ifdef  PRINT_LOGvoid DbgPrintToFileStart(void);void DbgPrintToFile(const TCHAR *format,...);void DbgPrintToFileEnd(void);#define PrintStart()          DbgPrintToFileStart();#define PrintLog(format,...)  DbgPrintToFile(format,##__VA_ARGS__);#define PrintEnd()            DbgPrintToFileEnd();#else#define PrintStart()#define PrintLog(format,...)#define PrintEnd()#endifstatic FILE *fp = NULL;void DbgPrintToFileStart(){if(!fp)fp = fopen("\\NAND2\\DbgLog.Log", "a+");}void DbgPrintToFile(const char *format,...){va_list ap;va_start(ap,format);//vprintf(format,ap);          // 打印到串口if(fp) vfprintf(fp,format,ap); // 写文件va_end(ap); fflush(fp);}void DbgPrintToFileEnd(void){if(fp){fclose(fp); fp = NULL;  }}//////////////////////////////////////////////////////////////////////


 

这样,在程序启动和退出时分别调用PrintStart()、PrintEnd(),在程序执行过程中,可以很方便的通过PrintLog()输出调试信息到文件了。