const 防止誤改。/W4 最高警告等級。/GZ,提前發現 Release 才會出現的問題(未初始化變數、堆疊破壞等)。Assert(原則:極簡)僅 Debug 生效,Release 自動移除。範例:
char* strcpy(char* dest, char* source) {
assert(source != 0);
assert(dest != 0);
char* ret = dest;
while ((*dest++ = *source++) != '\0') ;
return ret;
}
以 if 明確檢查並優雅退出,而非單純斷言:
char* strcpy(char* dest, char* source) {
if (!source) { assert(false); return 0; }
if (!dest) { assert(false); return 0; }
/* ... 正常邏輯 ... */
}
TraceTRACE:MFC 專用,僅 Debug 輸出至 Output 視窗。CString cs="test"; TRACE("CString is %s\n", cs);ATLTRACE:ATL 專用。afxDump:配合 #ifdef _DEBUG 輸出複雜物件(如 CTime)。GetLastError 精準定位 API 失敗原因錯誤發生時勿直接報錯退出,應嘗試:
TRACE,Call Stack 視窗追蹤呼叫鏈。/MAPINFO:LINES、/MAPINFO:EXPORTS。Program Database,Link → Debug Info 勾選 Microsoft format。@err 或 @err,hr(含文字說明)。| 現象 | 可能原因 | 對策 |
|---|---|---|
| 函式返回時崩潰 | 自動變數越界 / 函式原型不匹配 | 檢查陣列邊界、核對宣告與定義 |
| MFC 使用者訊息處理失效 | 函式原型錯誤 | 正確原型:afx_msg LRESULT OnMyMessage(WPARAM, LPARAM); |
| 資源洩漏 | 濫用 TerminateThread | 極度避免,改用旗標通知執行緒自行結束 |
| 執行緒建立異常 | 使用 CreateThread | 改用 _beginthreadex,正確初始化 CRT |
良好的編碼習慣、嚴格的編譯選項、系統化的除錯流程,是提升 VC++ 開發效率與軟體品質的三大支柱。