Applistar

6. 1. 4 名前空間の定義はどのように行うのですか

TOP > 6 SystemCを理解するためのC++入門 > 6. 1 SystemCユーザのための C++ FAQ > 6. 1. 4 名前空間の定義はどのように行うのですか
  6. 1. 4 名前空間の定義はどのように行うのですか  

6. 1. 4 名前空間の定義はどのように行うのですか

C の場合、関数名については、最終的な実行形式を作る時点で、 名前については、たった一つの空間しかありませんでした。 そこで、重複(衝突)を避けるために、名前の工夫が必要でした。 これは関数ばかりでなく大域変数(global variable)も同様でした。

しかし C++ では名前空間というものが導入されました。

namespace N {
}

とすると、名前空間 N を作ります。 この波形かっこの中の名前はこの中だけで有効な名前に なります。

これは同じファイルの別の部分に記述してもいいですし、別のファイル に書いても同じ名前空間とすることが出来ます。つまり上に書いた namespace N とは別に、また他のところに

namespace N {
}

という部分があれば、結果的には、それらは飛地のように、一つの名前空間と して扱われます。

この名前空間の中で作った名前を 外から参照する必要がある時には、 前に N:: という文字を付けます。

ある別の名前空間で、N::f() を良く使うので、簡単に書きたい、 という時には次のように書いておくと、f()と書いただけで N::f() の意味になります。

using N::f;

また、 まとめて、別の空間の識別子(identifier)を良く参照すると いうような場合には、次のように書いておきます。

using namespace N;

そうすると、この文以降に 記述する名前で、N:: にあるものは、N:: を付けないで参照出来ます。

良く使われるのは次のような文で、これは C のへッダを参照する時に使います。

using namespace std;

6. 1. 4. 1 名前空間の別名定義

A という空間と B という空間を作ったけれど、実は同じものとした かったという時には、

namespace A = B;

のようにして別名定義を使うと混ぜることが出来ます。 また別名定義は次のような場合にも使えます。

  • 長い名前で定義されているものを短い名前で参照するとき
  • Xで定義されているものとYで定義されているものを(静的に)切替えて使いたい

後者の例としては次のような例があります。 まず、

using namespace Z;

とするか、 Z:: で参照しておきます。

そうして、次の文のどちらかを生かすことで、全体を切替えられます。

namespace Z = X;  //  X 側を使う
namespace Z = Y;  //  Y 側を使う

デバッグ動作と通常動作を切替えたり、版を入替えるなどに使えます。

以上の例では説明を簡潔にするため、namespace に N という名前を使い ましたが、実際には、もう少し長い、組織名などを使った方が、安全です。

  6. 1. 4 名前空間の定義はどのように行うのですか  
TOP > 6 SystemCを理解するためのC++入門 > 6. 1 SystemCユーザのための C++ FAQ > 6. 1. 4 名前空間の定義はどのように行うのですか