現象
初學者寫 `#include ` 編譯報錯,改成 `#include ` 即通過。為什麼標準庫還要 `.h` 卻不能用?
歷史脈絡
階段
標頭檔 | 命名空間 | 編譯器支援 |
| C++98 前 (舊標準) |
``、``... |
全域命名空間 |
舊編譯器 (VC6, Turbo C++) |
| C++98 標準化 |
``、``... (無 `.h`) |
`std` 命名空間 |
所有現代編譯器 (GCC, Clang, MSVC, Intel) |
| C++11/14/17/20 |
同上,持續擴充 |
`std` |
標準要求 |
關鍵差異
- 命名空間:舊版汙染全域命名空間;新版所有符號在 `std::` 下 (如 `std::cout`、`std::cin`、`std::endl`)。
- 標準合規:`` **不在 C++ 標準內**,屬於編譯器擴充。現代編譯器 (VS2010+, GCC 3+) **不再提供** 或標記為棄用。
- 功能差異:新版支援區域設定、寬字元、樣板化運算子等現代特性;舊版無。
正確寫法
#include // 標準 C++
int main() {
std::cout << "Hello, Standard C++!" << std::endl;
// 或 using namespace std; (僅限 .cpp 檔,避免汙染)
return 0;
}
常見誤區
- 以為 `.h` 才是「標頭檔」標準寫法 → **錯**。C++ 標準庫標頭檔**不帶 `.h`**。
- C 標頭檔在 C++ 中用 ``、`` (帶 `c` 前綴、無 `.h`),同樣置於 `std::`。
- 專案移植舊代碼大量用 `iostream.h` → 批次替換並加上 `std::` 或 `using namespace std;`。
結論
`#include ` 是**前標準化時代的遺物**。現代 C++ (C++98 起) **強制使用無 `.h` 的標頭檔並配合 `std` 命名空間**。VS2010+、GCC、Clang 均不再支援 `.h` 版本,請直接使用 `` 等標準標頭。