using namespace std;の是非

std名前空間とは

std名前空間とは、C/C++の標準ライブラリ全体を包んでいる名前空間です。

C++ではヘッダファイルという呼び名を嫌い、単にヘッダと呼びますが、 呼び方が変わっただけでなく名前も変わりました。

C/(昔の)C++のヘッダファイルからは".h"が外され、 Cのヘッダファイルはそれに加えて先頭に"c"が付きました。

具体的な例を示すと、iostream.hはiostreamになり、 stdio.hはcstdioになりました。

こうすることによって、 古いヘッダファイルをインクルードしている既存のプログラムをエラーにせず、 新しいヘッダをインクルードすることで名前空間に包んだ安全な関数を呼び出せるようにしています。

std名前空間の問題

しかしstd名前空間には問題もあります。 広すぎる点と、その広大な名前空間を一瞬でグローバルに出来る手段がある点です。

広すぎる名前空間

std名前空間はC/C++の標準的なヘッダファイルだったものをほぼ全て含む、 超広大な名前空間です。

名前空間には名前の衝突を避けると言う問題の他に、 機能別に分けることも可能であり、 機能別に分ければ自然と名前空間は小さくなります。

しかしなぜかC++の標準化委員会はstdと言うひとつの名前空間にまとめました。

これはかなり疑問に思っていることであり、 納得もいきません。 理由をご存知の方は是非とも教えてください。

using namespace std;

ここまで読んできた方なら"using namespace std;" の問題は分かるでしょうが、一応説明します。 これの問題は、 超広大なstd名前空間がそのファイル内でグローバル(となんら変わらないもの) になってしまう点です。 これでは名前空間に包んだ意味がありません。 名前空間をもっと細かく分けていればここまで酷くはならなかったのですが・・・

実際はヘッダをインクルードしない限りこれといった害は無いのですが、 C++の標準化委員会はファイルを意識しない仕組みが作りたくてヘッダファイルをヘッダにしたのに、 ファイルを意識することでこの問題を回避しているわけです。

つまり、名前空間の使用を宣言したとしても実際のファイル名を指定しない限りその名前空間全てが使用可能になるわけではないのです。

このままでインクルードの仕組みを変更すると(おそらく将来変更される)、 いまのヘッダは全て破棄することになると思うのですが・・・

インクルードしない限り安全ですが、 それは何の気休めにもなりません。 なぜなら"using namespace std;" を記述するのなら最低ひとつのヘッダはインクルードするはずだからです。

ですから、std名前空間に関してusing指令は使用せず、using宣言を使用しましょう。

少々面倒に思えますが、私は全てに"std::"を使用しています。 そしてヘッダでは絶対にusing指令は使いません。 これを使用するのは.cppファイルか、使い捨てソフトのみです。