什麼是頭文件?
頭文件(Header File,慣用 `.h` 副檔名)是 C 語言**宣告**的集合,主要包含:
- 函數原型(如 `
int printf(const char*, ...);`)
- 巨集定義(如 `
#define NULL ((void*)0)`)
- 型別定義(`typedef`)、結構體/聯合/列舉標籤宣告
- 外部變數宣告(`extern int errno;`)
- 內聯函數定義(C99 `inline`)
不包含:函數本體(定義)、變數定義(會導致多重定義連結錯誤)。
為什麼需要頭文件?
- 分離宣告與定義:`.c` 檔實作細節,`.h` 僅提供介面,實現資訊隱藏與模組化。
- 跨檔案共享:多個 `.c` 檔 `
#include "common.h"` 即可使用同一組函數/常數,避免重複撰寫宣告。
- 編譯器檢查:呼叫端透過頭文件得知函數參數型別、回傳型別,編譯器可進行型別檢查、隱含轉換。
- 系統庫介面:標準庫(`
<stdio.h>`、`<stdlib.h>` 等)提供作業系統/執行期庫功能的標準化介面。
兩種包含語法差異
| 語法 | 搜尋路徑 | 適用對象 |
#include <filename.h> | 系統標準目錄(如 `/usr/include`、VC `include` 目錄) | 標準庫、系統 API、第三方庫 |
#include "filename.h" | 先搜尋**目前原始檔所在目錄**,再搜尋系統目錄 | 專案自訂頭文件 |
防止重複包含:Include Guard
// myheader.h
#ifndef MYHEADER_H
#define MYHEADER_H
// 宣告內容...
int my_func(int);
#endif
或現代編譯器支援的 `#pragma once`(非標準但廣泛支援)。
常見標準頭文件速查
- ``:標準輸入輸出
- ``:記憶體管理、程式控制、轉換函數
- ``:字串操作
- ``:數學函數
- ``:字元分類與轉換
- ``:布林型別(C99)
- ``:固定寬度整數型別(C99)
- ``:斷言
- ``:錯誤碼
- ``:日期時間
自訂頭文件最佳實踐
- **僅放宣告**,定義放在對應 `.c`。
- **最小化依賴**:頭文件中盡量少 `#include` 其他頭文件,改用前置宣告(`struct Foo;`)。
- **命名空間前綴**:專案專用巨集/函數加前綴(如 `MYPROJ_`)避免衝突。
- **文件化註解**:使用 Doxygen 風格註解生成 API 文件。