printf、fprintf变参函数封装

       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-26
author:		firehood
*********************************************************************/
//////////////////////////////////////////////////////////////////////
#include <stdarg.h>
//////////////////////////////////////////////////////////////////////

#define PRINT_LOG  // 打印输出开关
#ifdef  PRINT_LOG
void 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()
#endif

static 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()输出调试信息到文件了。

你可能感兴趣的:(printf、fprintf变参函数封装)