在非MFC程序中使用調試宏

  遊戲製作已經開始採用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++ 而言,在其它的編譯器中可能其它不同的宏。

  Since it makes no sense to re-invent the wheel(譯者注:這好像是一句俗語,大致意思是“沒有必要(意義)自己從頭寫起”,但原句究竟如何,在下水平有限,實難猜出。故將原文放上,望高人賜教,感激不盡!),筆者在看了 MFC 的代碼之後類似地建立了自己的宏。對於 ASSERT()和 VERIFY()則去掉了花哨的“Debug assertion failed...”對話框,只是簡單的產生一個單純的斷點中斷。

  要使用 ASSERT(),VERIFY()和 TRACE(),有兩個文件是必需的:debug.hdebug.cpp。首先需要在工程中的主要頭文件裏中包含文件 debug.h。因爲它本身沒有包括其它任何頭文件,所以不必擔心會產生頭件的包含遞歸。另外還要將 debug.cpp 加入到工程中的源文件中。

這裏是代碼:


#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
 #ifdef _DEBUG 
#define TRACE _trace
 #else 
inline void _trace(LPCTSTR fmt, ...) { }
#define TRACE 1 ? (void)0 : _trace
#endif
 #endif  
  
#ifdef _DEBUG
#include <stdio.h>
#include <stdarg.h>
#include <windows.h>
 void _trace(char *fmt, ...) 
{
char out[1024];
va_list body;
va_start(body, fmt);
vsprintf(out, fmt, body);
va_end(body);
OutputDebugString(out);
}
#endif

譯者續:一點小擴展

  大家可以看到宏 TRACE()的最後,調用的是 OutPutDebugString()函數,只能將信息輸出到調試器窗口中,但我們同樣也可以實現 MFC 中的彈出式窗口,只要用 MessageBox()函數輸出就可以了。(不過……好像樣子也不一樣哎!)

手記:

  此爲本人的第一篇翻譯習作,其中胡扯八道、亂七八糟、稀奇古怪之處數不勝數!(汗……)但看到這篇文章既短又小、語法簡單,不翻白不翻,所以就操刀上陣,爲大家做成這道小菜!

  不過說實話,這篇文章確實很不錯,WinDancer 每次在寫基於 WIN32 SDK 的程序時都會感嘆沒有這樣的宏可用,相信也有很多同志也這麼想過。雖然 SDK 下可以用 assert(),但卻沒有 TRACE()這樣的好東東呀!現在有了這篇文章就可以了大家的心事了!

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