結論:C++ 不是 C 的超集,而是「以 C 為基礎語法核心、引入面向對象/泛型/資源管理等新範式」的獨立語言。
核心差異:設計哲學
| 維度 | C | C++ |
|---|
| 核心抽象 | 函式 + 結構體 (資料與行為分離) | 類 (資料與行為封裝) + 模板 (泛型程式設計) |
| 資源管理 | 手動 `malloc/free`、`fopen/fclose` | RAII (建構子獲取、解構子釋放) + 智慧指標 |
| 錯誤處理 | 返回碼 + `errno` + `setjmp/longjmp` | 例外 (Exception) + `noexcept` + `std::expected` (C++23) |
| 型別系統 | 靜態、名義、弱隱式轉換 | 靜態、名義+結構化 (Concepts)、強型別、型別推導、CTAD |
| 編譯模型 | 單遍掃描可行、頭檔包含模型 | 多遍、模板實例化、ADL、SFINAE、模組 (C++20)、預編譯頭 |
| 標準庫哲學 | 最小化、薄封裝 OS API | 豐富通用組件 (容器/演算法/迭代器/視圖/範圍/格式化/執行緒/檔案系統/網路) |
相容性現狀
- C 代碼在 C++ 編譯器下: 約 95% 合法 C90 代碼可直接編譯,但隱式 `void*` 轉換、關鍵字衝突、字串字面值 `const` 性、空參函式語義、VLA、指定初始化器、複數類型等會導致編譯錯誤或行為不同。
- C++ 代碼在 C 編譯器下: 完全不可行 (類、模板、例外、重載、命名空間、運算子多載、lambda、標準庫容器等無對應語法)。
混合編程最佳實踐
// C 庫頭檔 mylib.h
#ifdef __cplusplus
extern "C" {
#endif
void mylib_init(void);
int mylib_process(const char *input, char *output, size_t out_sz);
void mylib_cleanup(void);
#ifdef __cplusplus
}
#endif
- C 庫提供 `extern "C"` 介面,隱藏 C++ 符號修飾 (Name Mangling)。
- C++ 專案編譯 C 源檔時用 C 編譯器 (`gcc`/`clang`),或編譯為靜態/動態庫再鏈結。
- 跨語言傳遞資料:使用 POD (Plain Old Data) 結構體、固定寬度整數 (``/``)、避免傳遞 C++ 類對象/STL 容器/智慧指標。