C 是「過程式導向」的系統程式語言;C++ 是「多範式」(過程式 + 物件導向 + 泛型 + 函數式)的系統程式語言,且致力於 零開銷抽象。
| 維度 | C (C17/C23) | C++ (C++20/23) | 本質差異 |
|---|---|---|---|
| 程式設計範式 | 過程式導向 | 多範式:OOP、泛型、函數式、元程式 | C++ 提供抽象工具,C 依賴規約與紀律 |
| 抽象機制 | 結構體 + 函數指標 + 巨集 | 類/結構體(封裝、繼承、多態)、模板、Concepts | C++ 抽象由編譯器強制、型別安全 |
| 資源管理 | 手動 malloc/free、open/close | RAII、智慧指標 (unique_ptr/shared_ptr)、容器自動管理 | C++ 透過解構函數實現確定性釋放 |
| 泛型程式設計 | 巨集、void*、_Generic (C11) | 模板、Concepts、標準庫演算法/容器/迭代器 | C++ 泛型編譯期展開、型別安全、零開銷 |
| 錯誤處理 | 返回碼、errno、setjmp/longjmp | 例外處理、std::expected (C++23)、契約式程式設計 | C++ 支援堆疊展開與資源自動清理 |
| 標準庫 | 小而精:字串、數學、I/O、記憶體、時間 | 龐大:容器、演算法、字串、正則、執行緒、檔案系統、網路、格式化 | C++ 標準庫即「電池內含」 |
| 型別系統 | 靜態、弱型別(隱含轉換多) | 靜態、強型別(explicit、static_cast、Concepts 約束) | C++ 編譯期捕捉更多錯誤 |
| 編譯模型 | 預處理→編譯→組譯→連結,單通過 | 兩階段查找、模板具現化、模組 (C++20)、編譯期計算 | C++ 編譯期能力極強(圖靈完備) |
| ABI 穩定性 | 極高,跨編譯器/語言通用 | 較低,名稱修飾、模板具現化、標準庫版本敏感 | C 仍是系統介面通用語言 |
// C 風格:資料與操作分離
struct Point { double x, y; };
double distance(const Point *a, const Point *b);
// C++ 風格:封裝、建構/解構、運算子多載
class Point {
double x_, y_;
public:
Point(double x, double y) : x_(x), y_(y) {}
double distance(const Point& other) const;
Point operator+(const Point& other) const;
};
// C: 手動管理,易洩漏
FILE *f = fopen("data.txt", "r");
if (f) { /* ... */ fclose(f); }
// C++: RAII 自動管理
std::ifstream f("data.txt"); // 解構時自動關閉
std::unique_ptr arr(new int[100]); // 自動 delete[]
std::shared_ptr res = std::make_shared(); // 參考計數
// C: 巨集或 void* 實現泛型,不安全
#define MAX(a,b) ((a)>(b)?(a):(b))
// C++: 型別安全、編譯期展開、零開銷
template T max(T a, T b) { return a > b ? a : b; }
std::vector v = {1,2,3};
std::sort(v.begin(), v.end(), std::greater<>{});
auto x = func();for (auto& e : vec)[](int x){ return x*2; }std::thread, std::mutex, std::futurestd::filesystem::pathimport std; (C++20) 取代標頭檔template (C++20) 約束模板參數co_await, co_yield (C++20) 非同步程式設計struct、const、inline),易混淆形成「C with Classes」惡習。std::list、手動記憶體→智慧指標),體會抽象帶來的安全與表達力。| 場景 | 推薦語言 | 理由 |
|---|---|---|
| 作業系統核心、裝置驅動、啟動載入器 | C | ABI 穩定、無執行時、編譯器支援最廣、核心社群慣例 |
| 嵌入式裸機/RTOS(記憶體 < 64KB) | C / C++ 子集 | 程式碼大小可控、無例外/RTTI 開銷、認證標準(MISRA C) |
| 高效能伺服器、遊戲引擎、即時渲染 | C++ | 抽象零開銷、模板元程式、SIMD 內建、多執行緒標準庫 |
| 大型應用軟體、GUI、資料庫引擎、瀏覽器 | C++ | 模組化、型別安全、豐富標準庫、生態成熟 |
| 跨語言呼叫介面 (FFI)、插件系統、動態庫 | C 介面 | C++ 類無法直接跨語言,需 extern "C" 包裝 |
C++ 不只是「C 加了類」。它是一個 為系統程式設計而生的多範式語言,核心哲學是 「你不使用的特性不付出代價,你使用的特性手寫也做不到更好」(零開銷抽象)。學好 C 是學好 C++ 的前提;學好 C++ 能讓你在更高抽象層級構建可靠、高效、可維護的系統。