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