| 方式 | 優點 | 缺點 |
|---|---|---|
| 重寫代碼 | 無依賴 | 極其低效 |
| 複製粘貼 | 快速 | 版本混亂、難維護 |
extern 聲明 | 跨文件共享 | 聲明分散、易出錯 |
| 頭文件 | **集中聲明、編譯器自動展開、支持模板** | 需注意重複包含 |
「將類、函數、宏等聲明集中,#include 時由預處理器原文展開」。**擴展名不強制為 .h**,標準庫如 <iostream> 無後綴。
| 指令 | 用途 |
|---|---|
#include | 包含文件,<>搜系統路徑,""先搜當前目錄 |
#define/#undef | 定義/取消宏 |
#if/#ifdef/#ifndef | 條件編譯 |
#elif/#else/#endif | 多分支/結束 |
#error | 強制報錯停止編譯 |
#pragma | 編譯器特定指令(如 #pragma once 防重複包含) |
// mylib.h #ifndef MYLIB_H #define MYLIB_H // 聲明/定義... #endif // MYLIB_H
或現代編譯器支持 #pragma once(更簡潔)。
| 關鍵字 | 含義 | 典型場景 |
|---|---|---|
extern | 僅聲明,不定義(不分配內存) | 跨文件共享全局變量/函數 |
static | 靜態存儲期;文件作用域時限制鏈接內部 | 單例、模塊私有變量 |
register | 建議存寄存器(現代編譯器自動優化,基本忽略) | 極熱變量 |
auto | 自動存儲期(塊作用域默認),C++11 後改為類型推導 | 局部變量 |
模板定義**必須**放在頭文件(或 .inl 包含),否則鏈接期找不到實例化代碼。這是「頭文件只放聲明」規則的例外。
// algorithms.h #pragma once #include#include namespace mylib { template void quick_sort(std::vector & v) { std::sort(v.begin(), v.end()); // 示例 } }
// main.cpp
#include "algorithms.h"
int main() {
std::vector v = {3,1,4,1,5};
mylib::quick_sort(v);
}
頭文件 + 預編譯條件編譯 + 合理存儲類 = **穩定、靈活、高效** 的 C++ 組件封裝基石。