Herb Sutter 的《Exceptional C++》系列深入探討了 C++ 進階技巧。其中,契約式編程與主動調試相輔相成:契約定義了模塊間的「合同」,而主動調試(如斷言)則是違約時的「法律制裁」。兩者結合,能在開發早期暴露缺陷,大幅降低後期修復成本。
函數入口處應驗證所有輸入參數的合法性。例如:
BOOL GetPathItem(int i, LPTSTR szItem, int iLen) {
ASSERT(i > 0);
ASSERT(szItem != NULL);
ASSERT(iLen > 0 && iLen < MAX_PATH);
ASSERT(FALSE == IsBadWritePtr(szItem, iLen));
// ...
}
但僅檢查空指針不足,需結合業務邏輯進行深度校驗,防止非法地址或類型不匹配導致的未定義行為。
switch (nType) {
case GK_ENTITY_POINT: /* ... */ break;
case GK_ENTITY_PLINE: /* ... */ break;
default: ASSERT(0); // 未處理的枚舉值,立即報警
}
當後期擴展枚舉類型而遺漏更新此處時,斷言能第一時間提醒開發者。
在確信某狀態不可能發生的位置放置 ASSERT,一旦觸發即表示邏輯錯誤,需立即修正。
恰當、靈活地使用 ASSERT 進行主動調試,配合契約式編程思想,能顯著提升程序穩定性與安全性,縮短調試週期,提高開發效率。