using namespaceには要注意

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

C++では指定された名前空間を使う処理として、using namespaceというものがあるが、これは使い所に注意が必要なものである。特にC++のプログラミング本では説明なしに使っている場合が多いので、特に気をつける必要がある。

using namespaceは、主にそのままでは冗長なコードを短くするのに往々にして使われる。例えば以下のようなコードがある。

#include <iostream>
#include <cstdlib>

int main()
{
    std::string str = "Hello, world";
    std::cout << str << std::endl;
    return EXIT_SUCCESS;
}

この場合は、std::stringstd::coutstd::endlが該当する。これらはstdネームスペースに含まれる命令、関数、型だが、これが多く含まれる場合、冗長になってしまう。これを簡潔にしたい場合は、以下のような記述になるだろう。

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    string str = "Hello, world";
    cout << str << endl;
    return EXIT_SUCCESS;
}

ここでは、using namespace stdで、stdに属する関数や型が使われるということを明示できる。この場合はファイル単位で使われる。

ただ、気をつけなければならないのは、インクルードに使われるヘッダーファイルには絶対にusing namespaceを使ってはいけないという点である。万が一それをしてしまうと、そのファイルにインクルードしている全てのファイルがその名前空間を使うということになってしまい、混乱が生じてしまうという他に、万一関数名や型の名前が一緒だった場合にビルドエラーが発生、あるいは予期せぬバグに見舞われるからである。

こういった問題点があるため、基本的には実装ファイルにとどめるべきである、できれば、以下のように関数単位で行うと良いだろう。

#include <iostream>
#include <cstdlib>

int main()
{
    using namespace std;
    string str = "Hello, world";
    cout << str << endl;
    return EXIT_SUCCESS;
}

こうすれば、main()関数内だけにとどめることができる。

タイトルとURLをコピーしました