名前空間 (C++)
C++ 言語は、1 つのグローバル名前空間を提供します。 これにより、グローバル名の競合による問題が生じる可能性があります。 たとえば、次の 2 つの C++ ヘッダー ファイルについて考えてみます。
char func(char);
class String { ... };
// somelib.h
class String { ... };
これらの定義によって、String クラスが競合するため、1 つのプログラムで両方のヘッダー ファイルを使用することはできなくなります。
名前空間は、その内部で宣言される名前に追加識別子を付加する宣言領域です。 追加識別子により、プログラム内の他の場所で宣言された名前と競合する可能性が低くなります。 同じ翻訳単位にある名前でも、競合せずに個別の名前空間で同じ名前を使用できます。 各名前は、個別の名前空間内にある限り、名前空間の識別子が追加されるために一意です。 次に例を示します。
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;
}
すべての名前空間の外部における、翻訳単位のファイル スコープでの宣言は、グローバル名前空間のメンバーのままです。