3

重複の可能性:
Using std Namespace
なぜ「using namespace std;」なのか C ++で悪い習慣と見なされますか?

#include <iostream>C++ で使用していて、print ステートメントを作成しているとしましょう。次のいずれかを選択できます。

using namespace std;
[...]
cout << "Hello" << endl;

また

using std::cout;
using std::endl;
[...]
cout << "Hello" << endl;

また

std::cout << "Hello" << std::endl;

おそらくこれは間違っていると思いますが、最初のものはプログラムに多くの不必要な肥大化を追加する可能性があるため、避けるべきだと思います。ただし、パフォーマンスに関しては、2 番目と 3 番目のスタイルに違いがあるかどうかはわかりません。ライブラリを使用するコードの大部分は、3 番目のスタイルを使用する傾向があります。ただし、特に問題の関数またはオブジェクトを多数呼び出す場合は、2番目の方法を使用することにトレードオフがない場合、これが最もクリーンで読みやすい方法のように思えます。

誰でも私を啓発できますか?

4

4 に答える 4

11

どちらの方法を選択しても、パフォーマンスの違い、つまり「肥大化」はありません。

ただし、そうすると、たとえば

using namespace std;
using namespace boost;

2つの名前空間で名前が競合すると、多くの問題が発生します。

バージョン3は、std::coutどこでもetcを使用する方が読みやすく、将来の名前の競合からあなたを救うと思います。

それが希望しない場合は、オプション2が2番目に優れています。これは、名前空間からいくつかの選択された名前を導入するだけだからです。ただし、この例では、using宣言には、残りのコードを入力しないことで節約できるよりも多くの文字が含まれているため、入力に正味の損失があることに注意してください。std::

于 2012-08-07T11:58:35.247 に答える
8

私の経験則: using namespace.h を入れてはいけませんが、.cppファイルで自由に使用してください。特にusing namespace std

于 2012-08-07T11:56:56.820 に答える
4

これらのそれぞれによって生成されるコードは、まったく同じである必要があります。stdコンパイル時にすべての名前をコードで使用できるようにするだけなので、最初から肥大化することはありません。使用されていないものは取得されません。std実際に使用されたcoutのはからの名前だけなendlので、コンパイルされたコードの最終結果は同じです。

長所と短所は次のとおりです。

  1. これは、ほとんどの行でより簡潔なコードになります。これを読んでいる人は、とがどこで定義されているかについて、もう少し難しく考えなければならないかもしれませんが、それらがよく知られているものであれば、それはそれほど大きな心配ではありません。それぞれの名前の意味の範囲がわずかに広いため、コンパイルに少し時間がかかる可能性がありますが、プログラムが大規模で、コンパイルしているマシンがかなり弱い場合を除き、おそらく無視できるものです。スコープ内の他の名前空間がまたは を定義している場合、名前があいまいになり、他のいずれかを使用する必要があります。coutendlcoutendl

  2. 1 番の利点は、2 つの名前を持ち込むだけで欠点が減少します。

  3. 1位とは真逆。コンパイラも開発者もソースを見る際にあいまいさはありませんが、より冗長になるという代償があります。

stdそのため、これらがファイル全体での唯一の使用であるstd場合はアプローチ 3 を使用する価値があるかもしれません。coutendlstd

または、あいまいさによって別のことを強いられない限り、常に番号 1 を使用することもできます。

この 2 つは相互に排他的ではありません。次のことができます。

using namespace std;
/*...*/
std::cout << "Hello" << std::endl;

もちろん、ここではstd::は冗長ですが、これらがコンテキスト内であいまいであるが、 の他の使用std法がそうでない場合、または人々が特定の名前に慣れていない可能性が高く、冗長なコードが読みやすさに役立つ場合に、これを行う可能性があります。このようにフルネームを指定すると、より一般的に見られる名前もいくつかあり、一般的なことを行うこと自体が読みやすさの助けになります。

それでも、あいまいさ (コンパイルされない) の場合を除けば、これらはすべてコンパイル時に同じプログラムを生成します。

編集:

ここでは .cpp ファイルを想定していましたが、ヘッダーについては他の方と同意見です。.h ファイルでは、それが含まれているすべてのファイルに対して決定を強制しています。あいまいさを持っているだけで、それを悪い呼び出しにすることができます。また、インクルージョンの場所が使用場所の近くにないため、開発者にはあまり目立ちません。

本当に .h ファイルで 1 または 2 を使用したい場合はusing、名前空間、クラス、または関数内に配置してスコープを設定します。そのため、ファイルをインクルードする人を待っている驚きはありません。

于 2012-08-07T12:09:03.790 に答える
3

私は通常、3 番目のスタイルを好みますが、1 番目または 2 番目のスタイルを使用する方がはるかにコンパクトでシンプルな場合もあります。時々ローカルで使用します。例えば:

void foo()
{
    using namespace std;
    //do stuff
}

using namespace stdしかし、モジュールにグローバルに書きたくない

于 2012-08-07T11:54:14.833 に答える