// 聲明
float average(float array[10]);
// 調用
aver = average(score);
// 定義 ❌ 拼寫錯誤:average 寫成 averge
float averge(float array[10]) { // 少了 'a'
// ...
}
Linker LNK2019:聲明了`average`,調用了`average`,但定義的是`averge`。連接器在所有目標文件中找不到`average`的機器碼。
| 階段 | 輸入 | 輸出 | 本錯誤發生階段 |
|---|---|---|---|
| 編譯 | .c → .obj | 目標文件 | ✅ 通過(聲明匹配) |
| 鏈接 | .obj + 庫 → .exe | 可執行文件 | ❌ 失敗(符號缺失) |
// 1. 查看錯誤列表,雙擊跳轉
// 2. 檢查函數簽名:返回類型、名稱、參數列表、調用約定
// 3. 搜索全項目:是否有定義?拼寫是否一致?
// 4. 若為庫函數:項目屬性 → 鏈接器 → 輸入 → 附加依賴項
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
float average(float array[], int n); // 唯一聲明處
#endif
// math_utils.c
#include "math_utils.h"
float average(float array[], int n) { // 定義與聲明強綁定
// 實現
}
// main.c
#include "math_utils.h" // 引用聲明
// 調用 average()
「無法解析的外部符號」= **聲明有、調用有、定義無**。養成「頭文件放聲明、源文件放定義、統一引用頭文件」的習慣,從源頭杜絕此類低級錯誤。