3 除錯
3.1 語法和語義錯誤
- 不符合C++語法的語句會產生語法錯誤(例如缺少分號/使用未宣告變數/括號不匹配),編譯器會捕捉語法錯誤
- 語法沒錯但是執行結果不對稱為語義錯誤/邏輯錯誤(分母為0/使用未初始化變數)
現代編譯器可以檢測到一些常見的邏輯錯誤,例如使用一個未初始化的變數。但是大部分邏輯錯誤編譯器無法捕獲
3.2 除錯過程
- 找到問題根因
- 理解問題
- 決定解決方法
- 修復問題
- 重新測試
3.3 除錯策略
- 程式碼檢查
- 執行程式並重現問題
3.4 基本除錯手段
- 註釋程式碼
- 驗證程式碼流(在函式開頭加上輸出語句)
使用
std::cerr
而不是std::cout
,因為cout是會快取的,cerr是立即輸出的
- 輸出變數或表示式的值
3.5 更多除錯手段
- 使用預處理指令來決定要不要輸出除錯語句
#include <iostream>
#define ENABLE_DEBUG // comment out to disable debugging
int main()
{
#ifdef ENABLE_DEBUG
std::cerr << "main() called\n";
#endif
int x{ getUserInput() };
std::cout << "You entered: " << x << '\n';
return 0;
}
- 使用
logger
將除錯資訊輸出到日誌檔案