#ifdef _DEBUG
// 對應Unicode的調試輸出
inline void MyTraceW(LPCTSTR strFormat, ...)
{
const int BUFFER_SIZE = 128;
va_list args = NULL;
va_start(args, strFormat);
TCHAR szBuffer[BUFFER_SIZE] = { 0 };
_vsntprintf(szBuffer, BUFFER_SIZE, strFormat, args);//_vsnwprintf for Unicode
va_end(args);
::OutputDebugString(szBuffer);
}
// 對應ASCII的調試輸出
inline void MyTraceA(const char* strFormat, ...)
{
const int BUFFER_SIZE = 128;
char szBuffer [BUFFER_SIZE] = {0};
va_list args = NULL;
// The va_start macro (defined in STDARG.H) is usually equivalent to:
// pArgList = (char *) &szFormat + sizeof (szFormat) ;
va_start (args, strFormat) ;
// The last argument to wvsprintf points to the arguments
_vsnprintf ( szBuffer, BUFFER_SIZE, strFormat, args) ;
// The va_end macro just zeroes out pArgList for no good reason
va_end (args);
::OutputDebugStringA (szBuffer);
}
#endif // _DEBUG
};
在軟體的開發過程裡,大部份時間是在做什麼呢?其實是在調試代碼,畢竟人類的思維方式是從簡單到複雜的過程,自然的認知過程也是從簡單到複雜。是以,開發軟體時,第一個版本總是先寫簡單的,然後慢慢地添加出錯處理上去,也把一些沒有想到的情況添加進去,那些沒有想到的錯誤,就叫做BUG。要根除一個軟體裡的BUG,是一件不容易的事情,不但要對這個軟體流程比較熟悉,還要對這個軟體的目标比較了解,還需要對這個開發平台了解,當然還需要不斷地測試不同的條件是否出錯。軟體的條件組合是2的N次方,是以不可能把所有組合都測試完成,隻能選擇比較重要的進行測試,隻要不影響軟體的使用,這個軟體就算是一款能夠掙錢的軟體了,不要希望這個軟體一點BUG都不出現,那是不現實的,或者說付出的代價也太大了,導緻這個軟體的開發成本過高,公司當然是不能生存下去。是以,怎麼樣去平衡可使用性與軟體的BUG,就成為一件藝術的事情。不同的場合是不同的需求的,一定不要為了完美而完美。下面就介紹怎麼樣使用OutputDebugString來輸出調試資訊到開發平台裡。
TRACE和OutputDebugString的差別
TRACE() is a part of MFC.
OutputDebugString is Windows API.
TRACE is a macro. It will be removed in Release built.
You can do printf() like format in TRACE() but not OutputDebugString:
TRACE("The number is %d\n", i);