我們知道TRACE和ASSERT宏是MFC架構程式內建的。但是要在非MFC程式中使用這兩個宏,我們怎麼實現呢。這裡給出一種實現的方法。將這兩個宏在debug.h檔案中實現。程式包含這個標頭檔就可以了。標頭檔及說明如下:
#ifndef _DEBUG_H_
#define _DEBUG_H_
#ifndef __AFX_H__
#define _T(x) x
#if defined _DEBUG
#include <stdio.h> /* vsprintf */
#include <crtdbg.h>
#define DPRINTF_BUF_SZ 1024
#define ASSERT(expr)/
do{/
if (!(expr)&&(1 == _CrtDbgReport(_CRT_ASSERT, __FILE__, __LINE__, NULL, #expr)))/
{__asm { int 3 };}/
}while(0)
static __inline void TRACE(char *fmt, ...)
{
va_list args;
char buf[DPRINTF_BUF_SZ];
va_start(args, fmt);
vsprintf(buf, fmt, args);
OutputDebugString(buf);
// FILE *fp = fopen("d://test.txt","a");
// fwrite(buf,strlen(buf),1,fp);
// fclose(fp);
}
#else
static __inline void TRACE(char *fmt, ...) {}
#define ASSERT(expr) if (expr) {NULL;}
#endif
#endif
#endif /* _DEBUG_H_ */
稍微做一下解釋:
(1){__asm { int 3 };}是系統中斷指令,這裡在C語言中嵌入了一個簡單的彙編語句。
(2)也可以將輸出到Debuger的調試語句輸出到文字檔。比如:d://test.txt
(3)va_start ,va_arg , va_end 是win32程式實現可變參數的機制。在UNIX下實現稍微有些不同,其包含va_dcl宏。va_list定義為:typedef char * va_list。具體請參考MSND。