TRACE 매크로는 실제로 AfxTrace 함수로 연결되어 있다.
AfxTrace의 함수 원형
void AFX_CDECL AfxTrace(LPCTSTR lpszFormat, ...)
{
va_list args;
va_start(args, lpszFormat);
int nBuf;
TCHAR szBuffer[512];
nBuf = _vsntprintf(szBuffer, _countof(szBuffer), lpszFormat,
args);
// was there an error? was the expanded string too long?
ASSERT(nBuf >= 0);
if ((afxTraceFlags & traceMultiApp) && (AfxGetApp() != NULL))
afxDump << AfxGetApp()->m_pszExeName << ": ";
afxDump << szBuffer;
va_end(args);
}
개인적으로 정확히 알지는 못하지만 여러 가지 예외 현상이 발생할 소지가 많기 때문에 사용을
피하라고 알고 있어서 잘 사용하지는 않는다.
일단 버퍼 사이즈가 512byte로 잡혀 있는데 저 사이즈를 넘을 때도 문제가 생길수 있다.
따라서 디버깅이 필요할 경우 자신의 매크로를 만들어 사용하는 것이 좋다고 해서 매크로를
직접 만들어 사용한다.
ex) MyOutputDbgStr( , )
MYRESULT MyOutputDbgStr(MYRESULT MyReturn, const char *pszFmt, ...)
{
TCHAR sz[512];
va_list vargs;
const char* pszFormat = pszFmt;
va_start(vargs, pszFmt);
wvsprintf(sz, pszFormat, vargs);
va_end(vargs);
OutputDebugStringA(sz);
return MyReturn;
}
사용 예
#define TraceResult() \
(MyOutputDbgStr(TRUE, "%s(%d) : *** TRACE *** \n", __FILE__, __LINE__))
if(error) TraceResult();
출력
d:\work\testTrace\trace.c(17) : ***TRACE***