namespace

名前空間とは名前の衝突を防ぐための機能です。

変数や関数などの識別子は、同一スコープ内で複数の意味を持つことができません。

C言語のソースコードを書く時は同じ名前の変数や関数を避ける為に命名規則を用いることがあります。
もし命名規則を用いずに大規模なプログラムを作った場合、特にグローバルな識別子で名前が衝突してしまう可能性があります。

そこでC++では namespace が導入されました。
namespace Namae {
}
こう書くことにより、スコープ内の記述はグローバルな位置から名前によって分類されます。

namespaceは基本的にグローバルな位置で宣言します。
スコープ内でのコードは通常通り書いていくことが出来ます。

名前空間へのアクセス

同じ名前空間の中ならばそのままアクセスすることが出来ますが、
別の名前空間の中へアクセスするには スコープ解決演算子 を使います。
名前::識別子;
標準出力に使う std::cout は
標準ライブラリの std という名前空間内にある cout という機能を呼び出しているのです。

以下は同じ名前の関数が、別々の名前空間にある例です。
#include < iostream >

namespace NameA{
	int n = 10;

	void hoge(){
		std::cout << "こちらはAです" << std::endl;
	}
}

namespace NameB{
	void hoge(){
		std::cout << "こっちはBです" << std::endl;
	}
}

int main(){
	NameA::hoge();
	NameB::hoge();
	std::cout << NameA::n;
	return 0;
}

using namespace

同じ名前空間に続けてアクセスするとき、毎回 :: をつけるのは面倒な場合があります。
そこで usingディレクティブ を使い、特定の名前空間へのスコープ解決演算子を省略することができます。
using namespace 名前;

#include < iostream >

int main(){
	using namespace std;

	cout << "指定した名前空間を" << endl << "省略できます。" << endl;
	return 0;
}

名前空間のネスト

名前空間の中にも名前空間を定義することができます。
namespace NameA{
	namespace NameB{
		namespace NameC{
			int num;
		}
	}
}
NameAの外からnumにアクセスするには次のように書きます。
NameA::NameB::NameC::num;

名前なし名前空間

名前が無い名前空間は
同一ファイル内からのみアクセスできます
namespace {
	int a;
}
スコープ解決演算子を使わなくてもアクセス可能ですが、
::a = 10;
とだけ書いてもアクセスできます。

グローバル名前空間

グローバル名前空間ははじめから定義されている最上位の無名名前空間です。
どこからでもアクセスできます。