MFC的TRACE具集指令, 可以在debug mode時啟用,而release mode時不執行. 但TRACE的參數是格式化的可變個數 (...). 到底MFC是如何做到的? 參考其定義檔 AFX.H
#ifdef _DEBUG
void AFX_CDECL AfxTrace(LPCTSTR lpszFormat, ...);
#define TRACE ::AfxTrace
#else
inline void AFX_CDECL AfxTrace(LPCTSTR, ...) { }
#define TRACE 1 ? (void)0 : ::AfxTrace
#endif
假設在程式裡我們如下叫用
TRACE("Hello I am %d years old", nAge);
則 debug mode 等效於如下
::AfxTrace("Hello I am %d years old", nAge);
release mode 則如下
if(1==1)
{}
else
::AfxTrace("Hello I am %d years old", nAge);
在release mode時會多做一個判斷式 if(1==1) (約3個組合語言碼) 但不會進入函式 ::AfxTrace()內, 當然還會佔用額外的程式碼空間. 不過與現在PC的資源比起來當然微不足道. 若要在release mode完全沒有Overhead, 可以用另外的巨集 TRACE0, TRACE1, TRACE2....
但需要視參數個數叫用不一樣的巨集.
若你不喜歡聯結MFC的library, 可以模仿以上的方式做自己的TRACE 巨集. 以下是我用的方法
mytrace.cpp
#ifdef _DEBUG
void MyDebugString(LPCTSTR lpszFormat, ...)
{
char buffer[ 256];
va_list argptr;
va_start(argptr, lpszFormat);
vsprintf(buffer, lpszFormat, argptr);
va_end(argptr);
::OutputDebugString(buffer);
}
#endif
mytrace.h
#ifdef _DEBUG
void MyDebugString(LPCTSTR lpszFormat, ...);
#define TRACE MyDebugString
#else
inline void MyDebugString(LPCTSTR lpszFormat, ...){}
#define TRACE 1 ? (void)0 : ::MyDebugString
#endif
留言列表