多人協作、引入第三方庫,全域變數/函數/類別名稱極易衝突(如雙方皆定義 fp、log、Config)。
namespace Li { // 小李的領域
FILE* fp = nullptr;
void init() { /* ... */ }
}
namespace Han { // 小韓的領域
FILE* fp = nullptr;
void init() { /* ... */ }
}
namespace 關鍵字定義作用域,內部可放變數、函數、類別、typedef、#define 等。// 1. 完全限定名(最明確,無衝突)
Li::fp = fopen("a.txt", "r");
Han::fp = fopen("b.txt", "rb+");
// 2. using 宣告:引入單一符號
using Li::fp;
fp = fopen("a.txt", "r"); // 直接用 fp → Li::fp
Han::fp = fopen("b.txt", "rb+"); // 仍需完整限定
// 3. using 指示:引入整個命名空間
using namespace Li;
fp = fopen("a.txt", "r"); // 直接用 fp → Li::fp
init(); // 直接用 init → Li::init
Han::fp = fopen("b.txt", "rb+"); // 他空間仍需限定
using namespace**:會污染所有包含該頭文件的翻譯單元。using namespace 可接受,全域避免。std::vector、MyLib::Config 最安全。using std::cout; using std::endl;。// A.h
namespace MyProject {
namespace Core {
class Engine { /* ... */ };
}
}
// B.cpp
namespace MyProject {
namespace Utils {
void helper() { /* ... */ }
}
}
// 同一命名空間可在多檔案分散定義,連結器合併
namespace { // 無名稱
int internal_id = 0; // 僅本翻譯單元可見,等同 static 全域變數
void helper() { /* ... */ }
}
替代 C 風格 static 全域變數/函數,更通用(支援類別、模板)。
namespace VeryLongLibraryName { class Widget {}; }
namespace VLN = VeryLongLibraryName; // 別名
VLN::Widget w; // 使用別名
namespace Name { ... },存取用 ::。using 宣告(單一符號)、using namespace 指示(整個空間)。using namespace,優先完全限定名,匿名空間替代 static 內部連結。