C++ usingとは? デフォルト名前空間

名前空間内の変数や関数を使う場合には、
スコープ解決演算子(::)が必要ですが、
記述量を減らして省略できる書き方があります。

usingの使い方

#include <iostream>

using namespace std;

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

using namespace aaa;      // ここから後のデフォルト名前空間は
                          // aaaとなる。

void main(void) {

      // aaa::aと書かなくても良い。
      cout << "名前空間aaaのグローバル変数a=" << a << '\n';

      // aaa::show()と書かなくても良い。
      show();
}

上記の例のようにusingキーワードを使う事により、
デフォルト名前空間が決定され、
その地点から後に記述される変数名や関数名は、

デフォルトでaaa::が付加された状態で認識され、
存在しない場合は、グローバル変数、関数と認識されるようになります。

もうひとつのusingキーワードの使い方があります。

名前空間内の変数や関数を個別に指定する

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

using aaa::show;      // ここから後に記述されるshowは、
                      // aaa::showと認識される。

void main(void) {

      // showと書いたら、aaa::showと認識される。
      show();
}

この例では、名前空間aaaのshow関数だけに絞ってusing指定されています。

そのため、名前空間aaa内の別の変数や関数、
例えば変数aは、通常通りaaa::aと記述する必要があります。

また、usingキーワードは、関数内に記述する事もできます。

その場合は、usingキーワードを記述した関数内でのみ有効になります。


usingキーワードは、便利なものですが、
複数のusingキーワードを使用する場合には、少しばかり注意が必要です。

スポンサーリンク

複数のusingキーワードを使う場合

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

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

using namespace aaa;
using namespace bbb;

void main(void) {
      aaa::show();      // 正常
      bbb::show();      // 正常
      show();           // コンパイルエラー
}

この例では、関数main内でshow関数をコールしています。

1番と2番目のshow関数コールは問題ありませんが、
3番目のshow関数コールは、
名前空間aaa内のshow関数をコールするのか
名前空間bbb内のshow関数をコールするのか、はっきりしません。

こういった場合には、スコープ解決演算子(::)を使って
aaa::show();やbbb::show();のような表現をします。