遊戲制作已經開始采用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); // 譯注:輸出格式化後的字元串到調試器
}