close

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


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 free6d1823 的頭像
    free6d1823

    Free Software

    free6d1823 發表在 痞客邦 留言(0) 人氣()