C++ namespace 名前空間とは?

名前空間を説明する前に、
グローバル変数とグローバル関数の説明をします。

1つのプログラムの中に同じグローバル変数名が複数あると
コンパイルエラーとなってしまいます。

さらに、同じように
1つのプログラムの中に同じグローバル関数名が複数あると
コンパイルエラーとなってしまいます。

これは当然の事ですが、プログラムの規模が大きくなってきて
複数人での開発となった場合、
グローバル変数名、グローバル関数名が
衝突しない様に、気をつかう事となります。

プログラマ自身が気をつけなければならないため、
バグの温床となります。

名前空間

このグローバル変数、グローバル関数の名前の管理のために
用意された機能が名前空間機能です。

名前空間には、好きな名前をつける事ができ、
その名前空間がWindowsのフォルダのような機能を提供します。

例えば、1つのフォルダの中に
同じファイル名のファイルは作れません。
しかし、異なるフォルダ間であれば、
同じファイル名があっても大丈夫です。

これと同じように、
1つのプログラムの中に同じグローバル変数名は作れません。

しかし、異なる名前空間であれば、
同じグローバル変数名があっても大丈夫です。

と言う事です。(もちろん、グローバル関数も同様です。)

つまり、1つのプログラムの中に
擬似的なフォルダ機能を提供しているワケです。

なんとなくイメージがつかめたでしょうか?

実際のコード例を書いてみます。

#include <iostream>

using namespace std;

namespace aaa {
      int a = 10;
      void show(void);
}

namespace bbb {
      int a = 5;
      void show(void);
}

void main(void) {
      aaa::show();
      bbb::show();
}

namespace aaa {
      void show(void) {
            cout << "名前空間aaaのグローバル変数a=" << aaa::a << '\n';
      }
}

namespace bbb {
      void show(void) {
            cout << "名前空間bbbのグローバル変数a=" << bbb::a << '\n';
      }
}

このプログラム例では、
名前空間aaaと名前空間bbbを使っています。

それぞれの名前空間内に
グローバル変数aとグローバル関数showが含まれています。

名前は同じですが、異なる名前空間内に配置されているので、
両者は全く別物であり、区別されます。

それぞれの名前空間内のグローバル変数や関数を指定するには、
スコープ解決演算子(::)を使用します。

この演算子により、
個々の名前空間内の変数や関数を指定する事ができます。

また、このプログラムには、同じ名前空間が含まれています。

例えば名前空間aaaや名前空間bbb。

これらは、名前空間内の記述を分割できる事を示していて、
別ファイルでも同じ名前空間の記述が可能になります。

名前空間のネスト

名前空間内に名前空間を作る事もできます。

もちろん、それぞれの名前空間内の変数名、関数名は
別モノとして扱われます。

namespace aaa {
      int a = 5;
      void show(void);
      namespace bbb {
            int a = 10;
            void show(void);
      }
}

void main(void) {
      aaa::bbb::show();
}
スポンサーリンク

名前空間の活用例

名前空間機能の活用例としては、

佐藤君、鈴木君、田中君の3人で
1つのアプリケーション開発しているとしたら、
それぞれに固有の名前空間を割り当てて担当する。

例えば、佐藤君が作る全てプログラムは、
名前空間satou内で作るものとする。

以下、鈴木君と田中君も同じようにすれば、
それぞれが作ったプログラムを合わせた時に、
変数名や関数名の衝突がない事が
名前空間機能によって保証されているので、
そのような事を気をする必要がなくなります。

以上、名前空間の解説でした。
名前空間はとても便利な機能ですので、是非使ってみて下さい。