天天看點

在非MFC程式中使用調試宏 ASSERT(),VERIFY()和 TRACE()

遊戲制作已經開始采用C++了,卻鮮有人選擇使用MFC。但筆者覺得的 ASSERT(),VERIFY()和 TRACE()這幾個宏很好用。是以就想自己寫一個版本來适應Windows平台下不同的工程類型。

提醒:

ASSERT()被測試它的參數,若參數為0,則中斷執行并列印一段說明消息。在 Release 版本的程式中它不起任何作用。 VERIFY()和 ASSERT()很相似,差別在于在 Release 版本中它仍然有效(譯者注:原作者在這裡沒有講清楚,VERIFY()不會列印說明,隻是會對參數表達式求值)。 ASSERT()使用的時候必須保證參數表達式中不能有函數調用(譯者注:ASSERT()宏在 Release 版本中不對表達式求值),是以對于任何有函數調用的參數表達式,應該使用宏 VERIFY(),以保證表達式中的函數調用在 Release 版本中會被正确求值。 TRACE()基本上就是函數 printf()的一個複制品,唯一的差別是它把結果輸出到調試視窗。在 Release 版本中,它也是無效的。 這三個宏在 Release 版本中都不會産生任何實質性的影響,它們是否起作用取決于是否定義了預定義了宏 _DEBUG。這是對 Microsoft Visual C++ 而言,在其它的編譯器中可能其它不同的宏。

這裡是代碼:

#include "stdafx.h"  

#include <stdio.h>  

#include <stdarg.h>  

#include <windows.h>  

void _trace(char *fmt, ...);  

#ifdef _DEBUG  

#define ASSERT(x) {if(!(x)) _asm{int 0x03}}  

#define VERIFY(x) {if(!(x)) _asm{int 0x03}}     // 譯注:為調試版本時産生中斷有效  

#else  

#define ASSERT(x)  

#define VERIFY(x) x                             // 譯注:為發行版本時不産生中斷  

#endif  

#define TRACE _trace      

inline void _trace(LPCTSTR fmt, ...) { }  

#define TRACE    

void _trace(char *fmt, ...)  

{  

    char out[1024];  

    va_list body;  

    va_start(body, fmt);  

    vsprintf(out, fmt, body);     // 譯注:格式化輸入的字元串 fmtt  

    va_end(body);                 //       到輸出字元串 ou  

    OutputDebugStringA(out);       // 譯注:輸出格式化後的字元串到調試器  

}