これらのそれぞれによって生成されるコードは、まったく同じである必要があります。std
コンパイル時にすべての名前をコードで使用できるようにするだけなので、最初から肥大化することはありません。使用されていないものは取得されません。std
実際に使用されたcout
のはからの名前だけなendl
ので、コンパイルされたコードの最終結果は同じです。
長所と短所は次のとおりです。
これは、ほとんどの行でより簡潔なコードになります。これを読んでいる人は、とがどこで定義されているかについて、もう少し難しく考えなければならないかもしれませんが、それらがよく知られているものであれば、それはそれほど大きな心配ではありません。それぞれの名前の意味の範囲がわずかに広いため、コンパイルに少し時間がかかる可能性がありますが、プログラムが大規模で、コンパイルしているマシンがかなり弱い場合を除き、おそらく無視できるものです。スコープ内の他の名前空間がまたは を定義している場合、名前があいまいになり、他のいずれかを使用する必要があります。cout
endl
cout
endl
1 番の利点は、2 つの名前を持ち込むだけで欠点が減少します。
1位とは真逆。コンパイラも開発者もソースを見る際にあいまいさはありませんが、より冗長になるという代償があります。
std
そのため、これらがファイル全体での唯一の使用であるstd
場合はアプローチ 3 を使用する価値があるかもしれません。cout
endl
std
または、あいまいさによって別のことを強いられない限り、常に番号 1 を使用することもできます。
この 2 つは相互に排他的ではありません。次のことができます。
using namespace std;
/*...*/
std::cout << "Hello" << std::endl;
もちろん、ここではstd::
は冗長ですが、これらがコンテキスト内であいまいであるが、 の他の使用std
法がそうでない場合、または人々が特定の名前に慣れていない可能性が高く、冗長なコードが読みやすさに役立つ場合に、これを行う可能性があります。このようにフルネームを指定すると、より一般的に見られる名前もいくつかあり、一般的なことを行うこと自体が読みやすさの助けになります。
それでも、あいまいさ (コンパイルされない) の場合を除けば、これらはすべてコンパイル時に同じプログラムを生成します。
編集:
ここでは .cpp ファイルを想定していましたが、ヘッダーについては他の方と同意見です。.h ファイルでは、それが含まれているすべてのファイルに対して決定を強制しています。あいまいさを持っているだけで、それを悪い呼び出しにすることができます。また、インクルージョンの場所が使用場所の近くにないため、開発者にはあまり目立ちません。
本当に .h ファイルで 1 または 2 を使用したい場合はusing
、名前空間、クラス、または関数内に配置してスコープを設定します。そのため、ファイルをインクルードする人を待っている驚きはありません。