| 維度 | C 語言 | C++ | 本質區別 |
|---|---|---|---|
| 程式設計範式 | 面向過程 (Procedural) | 多範式:OO + 泛型 + 函數式 + 面向過程 | 思維模型:資料與函數分離 vs 封裝為物件 |
| 抽象機制 | 結構體 `struct` (僅資料)、函數指標模擬多態 | 類 `class` (封裝/繼承/多態)、模板 `template` (泛型)、Concepts (C20) | 運行期多態 vs 編譯期多態 (靜態多態) |
| 記憶體管理 | 手動 `malloc/free` | 手動 + RAII (建構子/解構子) + 智慧指標 (`unique_ptr`/`shared_ptr`) + 分配器 | 資源獲取即初始化 (RAII) 是 C++ 核心哲學 |
| 標準庫 | 極精簡 (C 標準庫) | 龐大 (STL 容器/演算法/迭代器、I/O 流、執行緒、檔案系統、正則、隨機數、原子操作...) | 「不要重複造輪子」 — — C++ 標準庫即基礎設施 |
| 錯誤處理 | 錯誤碼返回、`errno`、`setjmp/longjmp` | 異常 `try/catch/throw` + 錯誤碼 (底層/介面) + `std::expected` (C23) | 棧展開保證資源釋放 (RAII),但需注意異常安全承諾 |
| 編譯模型 | 預處理 → 編譯 → 組裝 → 鏈接,單元獨立 | 同 C + 模板實例化 (編譯期)、模組 (C20 `import`)、ADL (參數依賴查找) | 編譯期圖靈完備 (模板元程式設計),編譯時間長 |
| ABI 與二進位相容 | 極穩定,C ABI 是系統標準 | 脆弱:名稱修飾、虛表佈局、模板實例化、標準庫版本、編譯器版本皆影響 ABI | C++ 庫升級往往需重編譯依賴方,C 庫極少 |
| 工具鏈生態 | GCC/Clang/MSVC/TCC/ICC,極成熟 | 同編譯器 + CMake/Meson/Bazel、Clang-Tidy/Clang-Format、Sanitizers、LSP (clangd) | 現代 C++ 開發高度依賴 CMake + clangd + Sanitizers |
| 學習曲線與認知負載 | 語法小、概念少、指標/UB 難點集中 | 語法巨大 (C++23 超 2000 頁標準)、概念多 (價值類別、引用摺疊、完美轉發、SFINAE、Concepts...) | C++ 是「專家友好、新手殺手」語言,需長期刻意練習 |
// C 標頭檔
#ifdef __cplusplus
extern "C" {
#endif
void c_api_init(void);
int c_api_compute(int x, int y);
#ifdef __cplusplus
}
#endif
C 與 C++ 是**針對不同約束條件優化的兩種設計哲學**:C 追求**最小核心、最大控制、穩定 ABI**,C++ 追求**高級抽象、類型安全、零開銷泛化、工程規模化**。理解兩者本質差異與互操作邊界,才能在系統級工程中做出最優架構決策。