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()輸出調試信息到文件了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章