C++ 起源於 C,但不是 C 的超集,更非「升級版」。兩者由獨立標準委員會維護(C99 vs C++98),語法有交集也有分歧。無需先學 C 再學 C++,可根據項目需求直接切入。
C++/CLI、C# 屬於微軟生態,與標準 C/C++ 無本質關聯。切勿混淆「編譯器擴展」與「標準語法」。
/W4、-Wall -Wextra -pedantic)。// ✅ 標準頭文件用尖括號
#include <stdio.h>
#include <iostream>
// ❌ 雙引號包含系統頭文件(雖能通過編譯,但違背慣例)
#include "stdio.h"
// ✅ 標準寫法
int main(void) { ... }
int main(int argc, char *argv[]) { ... }
// ❌ 非標準
void main() { ... }
main() { ... } // 隱式 int 在 C++ 中非法,C99 要求至少警告
#include "stdafx.h" 是 MSVC 專用預編譯產物,切勿貼在公開代碼或跨平台項目中。
| 舊式 (已棄用) | 現代標準 | 規則 |
|---|---|---|
<iostream.h> | <iostream> | C++ 專有:去 .h,進 std 命名空間 |
<string.h> | <cstring> | C 兼容頭:去 .h,加 c 前綴 |
<stdio.h> | <cstdio> | 同上 |
注意:<string> (C++ string 類)、<cstring> (C 字符串函數)、<string.h> (舊式) 三者完全不同,勿混淆。
// ❌ C++ 中非法(僅為兼容舊碼保留)
char *p = "hello";
// ✅ 正確:字符串字面值不可修改
const char *p = "hello";
const char *p 與 char const *p 等價,均指向常量字符的指針。
// ❌ 未定義行為:i 被修改多次且無序列點
a[i] = i++;
x = ++i + i++;
標準未規定求值順序,結果完全取決於編譯器實現。
標準庫不包含 GUI、進程管理、網絡等系統相關功能。graphics.h、windows.h 均屬編譯器/平台擴展,非標準 C/C++。
Linux 內核、驅動、嵌入式固件大量使用 C;高性能服務端、遊戲引擎多用 C++。語言選擇取決於領域需求,而非操作系統。
除面向對象,C++ 還原生支持:
掌握語法只是入場券。數據結構、演算法、工具鏈、平台 API 才是解決實際問題的關鍵。
C/C++ 語法龐大復雜,建議根據項目定制「Better C」或「ADT 風格」等子集,降低認知負荷。
標準庫僅提供通用設施。汽車、航空、金融等領域均有成熟的 C/C++ 領域庫(AUTOSAR、ARINC 653 等),善用而非重造輪子。
// ✅ 推薦:無強轉,類型自動匹配
double *p = malloc(sizeof *p); // sizeof 運算元可為表達式,無需類型名
// ❌ 畫蛇添足:維護噩夢
double *p = (double *)malloc(sizeof(double));
歷史緣由:C89 前無 void*,malloc 返回 char* 需強轉。C89 引入 void* 可隱式轉換為任意對象指針,強轉自此多余。
維護陷阱:若後將 double* 改為 int*,所有強轉處均需同步修改,漏改即埋 Bug。無強轉寫法 malloc(sizeof *p) 完全免疫此類問題。
// C++ 無隱式 void* → T* 轉換
double *p = static_cast<double*>(malloc(sizeof *p));
這也是 C++ 推薦用 new/delete 或智能指針、容器的原因之一。
calloc、realloc、aligned_alloc 等返回 void* 的函數同理。