名前空間 (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;
}
翻訳単位のファイル スコープの宣言はすべての名前空間の外部でそれでもグローバル名前空間のメンバーです。