命名空間 (C++)
C++ 語言提供單一全域命名空間。 這可能會造成全域名稱衝突的問題。 例如,假設這兩個 C++ 標頭檔:
char func(char);
class String { ... };
// somelib.h
class String { ... };
在單一程式中,這些定義使用兩個標頭檔是不可能的; String 類別將衝突。
命名空間是宣告的區域,附加其他識別項到所有名稱宣告中。 其他識別項不太可能使其名稱與在程式中的其他位置宣告的名稱衝突。 使用相同名稱在個別命名空間沒有衝突的是有可能的,即使名稱出現在同一個轉譯單位中。 只要出現在不同的命名空間,每個名稱都是唯一的,因為加在命名空間識別項。 例如:
namespace one {
char func(char);
class String { ... };
}
// somelib.h
namespace SomeLib {
class String { ... };
}
現在類別名稱不會衝突,因為它們各自成為 one::String 和 SomeLib::String。
C++ 不允許重複的名稱命名空間。
// pluslang_namespace.cpp
// compile with: /c
// OK
namespace a {
namespace b {
int i;
}
}
// not allowed
namespace c::d { // C2653
int i;
}
在所有命名空間外,一個轉譯單位中的檔案範圍的宣告還是全域命名空間的成員。