コードを整理するための重要な仕組みのひとつが、名前空間です。2つの関数で名前が衝突することがありますが、それぞれを別の名前空間に置けば解決できます。名前空間は入れ子にすることもでき、大きなコードベースを構造化するのに役立ちます。名前空間へのアクセスには、スコープ解決演算子::を使います。
次の例では、2つの異なるfoo関数を使っています。それぞれの名前空間を先頭に付けることで、両方を一緒に使えます。
namespace my_ns {
int foo() {
return 44;
}
namespace my_inner_ns {
int baz() {
return 90;
}
}
}
namespace my_other_ns {
int foo() {
return -2;
}
}
int myresult{my_ns::foo() + my_other_ns::foo() * my_ns::my_inner_ns::baz()};
名前空間の入れ子が深くなると、記述が冗長になりすぎることがあります。usingで名前空間をインポートすれば、その冗長さを取り除けます。これは、すべての名前をグローバル名前空間に移します。区別を保つには、エイリアスが役立つでしょう。
int my_other_result{my_ns::my_inner_ns::baz()};
using namespace my_ns::my_inner_ns; // importing the complete namespace
int also_other_result{baz()};
namespace m = my_ns; // setting an alias
namespace o = my_other_ns;
int also_my_result{m::foo() + o::foo() * m::my_inner_ns::baz()};