C++ 標準庫所有識別符定義於 std 命名空間,解決不同函式庫間識別符衝突。正確使用命名空間是現代 C++ 開發的基礎技能。
<iostream> vs <iostream.h><iostream>:標準 C++,符號在 std 命名空間<iostream.h>:舊式非標準,符號在全域命名空間(已棄用)現代編譯器兩者為不同檔案,.h 版本為相容舊碼保留,新碼必須用無副檔名版本。
std::cout << std::hex << 3.4 << std::endl;
優點:零衝突風險,閱讀時清楚來源。缺點:冗長。
using std::cout; using std::endl; cout << std::hex << 3.4 << endl;
優點:僅引入需要的符號,減少衝突機率。缺點:需逐一聲明。
using namespace std; cout << hex << 3.4 << endl;
優點:一次引入所有符號。缺點:汙染全域命名空間,大型專案易發生衝突。
using namespace std; — 會汙染所有包含該標頭檔的編譯單元using std::xxx; 引入常用符號using namespace std; 限制汙染範圍// 檔案:demo.cpp
#include <iostream>
#include <sstream>
#include <string>
// 推薦:僅引入常用符號
using std::cout;
using std::endl;
using std::string;
using std::ostringstream;
void demo() {
// 局部使用 using namespace 限制範圍
using namespace std;
cout << "Hello " << hex << 255 << endl; // 輸出:Hello ff
ostringstream oss;
oss << "Value: " << 42;
string s = oss.str();
cout << s << endl;
}
int main() {
demo();
// 這裡 cout、endl 仍可用(檔案層級 using 声明)
cout << "Done" << endl;
return 0;
}
using namespace std; → 連鎖汙染string、vector 等標準庫名稱 → 命名衝突myproj::String