大型專案中類別、函數名稱衝突在所難免。C++ 透過 namespace 機制(類似 Java 的 package)解決命名衝突,是企業級開發必備技能。
HelloWorld())struct Node、B 模組 struct Node 結構不同// Hello.h
#pragma once
namespace SH {
class Hello {
public:
Hello(); ~Hello();
void SayHello();
};
void HelloWord(); // 命名空間內自由函數
}
// 可跨檔案延續同一命名空間
namespace SH {
void Hello2Sunly();
}
// Hello.cpp #include "Hello.h" #includeusing std::cout; using std::endl; namespace SH { Hello::Hello() {} Hello::~Hello() {} void Hello::SayHello() { cout << "how are you!" << endl; } void HelloWord() { cout << "Hello World!" << endl; } void Hello2Sunly() { cout << "Hello Sunly!" << endl; } } // 也可用全域作用域運算符定義 SH::Hello::Hello() {} void SH::HelloWord() { ... }
int main() {
std::cout << "Hello World!" << std::endl;
SH::Hello h; h.SayHello();
}
using std::cout; using std::endl;
using SH::Hello; using SH::HelloWord;
int main() {
cout << "Hello World!" << endl;
Hello h; h.SayHello();
HelloWord();
}
僅引入需要的符號,作用域從聲明處到檔案結尾。
using namespace std;
using namespace SH;
int main() {
cout << "Hello World!" << endl;
Hello h; h.SayHello();
Hello2Sunly();
}
將整個命名空間注入當前作用域,易發生衝突。
using namespace — 汙染所有包含者using 命名空間::符號; — 精確控制using namespace std; 限制汙染namespace A::B { ... } (C++17) 或 namespace A { namespace B { ... } }namespace { ... } 限制符號僅在本編譯單元可見(替代 static)