「using namespace std;」を宣言する必要があるのは何ですか?
-
19-09-2019 - |
質問
この質問は重複している可能性がありますが、適切な答えが見つかりません。短くてシンプル、宣言しなければならないこと
using namespace std;
C++プログラムでは?
解決
、事実上すべての標準ライブラリのstd名前空間内にあります。あなたはstd::
持つすべての標準ライブラリ呼び出しを修飾したくないのであれば、あなたはusingディレクティブを追加する必要があります。
ただし、
using namespace std;
は、このように名前の衝突のために多くの可能性を開く、あなたは実質的に全体の標準的な名前空間をインポートしているので、悪い習慣と考えられています。
のようにあなたが実際にあなたのコード内で使用しているだけのものをインポートすることをお勧めしますusing std::string;
他のヒント
、それはSTDと、その名前空間のすべてを接頭辞避けるために速記何もないん::
技術的には、あなたはを引数依存ルックアップを使用できるようにする(全体のネームスペースまたは個々の名前のために)を使用して使用する必要があります。
swap()
を使用する2つの以下の機能を考えてみます。
#include <iostream>
#include <algorithm>
namespace zzz
{
struct X {};
void swap(zzz::X&, zzz::X&)
{
std::cout << "Swapping X\n";
}
}
template <class T>
void dumb_swap(T& a, T& b)
{
std::cout << "dumb_swap\n";
std::swap(a, b);
}
template <class T>
void smart_swap(T& a, T& b)
{
std::cout << "smart_swap\n";
using std::swap;
swap(a, b);
}
int main()
{
zzz::X a, b;
dumb_swap(a, b);
smart_swap(a, b);
int i, j;
dumb_swap(i, j);
smart_swap(i, j);
}
dumb_swap
は常にstd::swap
呼び出す - 私たちは、むしろzzz::swap
オブジェクトのzzz::X
を使用して好むにもかかわらず。
smart_swap
は、フォールバックの選択肢(例えばint型で呼び出された場合)、それは完全修飾名を指定しないため、std::swap
はzzz::swap
のためのADLを介して使用されます。
zzz::X
見えます
<時間>
主観的に、どのようなusing namespace std;
を使用するように私を強制するなど、標準関数オブジェクトのすべての種類を使用するコードを書いている。
//copy numbers larger than 1 from stdin to stdout
remove_copy_if(
std::istream_iterator<int>(std::cin), std::istream_iterator<int>(),
std::ostream_iterator<int>(std::cout, "\n"),
std::bind2nd(std::less_equal<int>(), 0)
);
IMO、このstd::
ようなコードにだけラインノイズになります。
私はそれが実装ファイルで使用されている(しかし、でも、スワップの例のように、スコープを機能するように制限することができる)場合には、そのような場合には凶悪犯罪をusing namespace std;
見つけられないでしょう。
確かにヘッダファイルで使用して文を入れないでください。その理由は、これが潜在的にあなたのコントロール下ではないかもしれない他のヘッダ内のエラーにつながる問題の1の後に含まれている場合があります他のヘッダ、名前空間を汚染ということです。 (また、驚きの要因を追加します。ファイルを含め、人々が見えるように名前のすべての種類を期待していない可能性があります)。
明示的std
を参照する必要なしにstd::member
名前空間のメンバを参照する機能。たとえばます:
#include <iostream>
using namespace std;
...
cout << "Hi" << endl;
対ます。
#include <iostream>
...
std::cout << "Hi" << std::endl;
あなたは間違いなく言うべきではありません。
using namespace std;
あなたのC ++ヘッダーに、それは(それが「名前空間の汚染」を構成するであろうこと)の名前空間を使用しての全体のポイントを打つため。このトピックに関するいくつかの有用なリソースは次のとおりです。
2)にハーブサッターによって物品名前空間するへの移行
3) FAQ 27.5するからマーシャルクラインのC ++よくある質問ライトます。
まず、のこれはCで必要とされていないの - Cは、名前空間を持っていません。 C ++標準ライブラリのほとんどが含まれてstd
名前空間で何かで。これを行わない場合は、そのように明示的に名前空間のメンバーにアクセスする必要があります:
std::cout << "I am accessing stdout" << std::endl;
まず、using
ディレクティブはCで必要とされることはありません。
using
でそれらをつけることで直接アクセスすることができますので、 std::
ディレクティブは、C ++で実際にの必要なのことはありません。したがって、たとえばます:
using namespace std;
string myString;
に相当します
std::string myString;
あなたがそれを使用することを選択したかどうかは好みの問題ですが、いくつかのキーストロークを保存するために全体std
名前空間を暴露することは、一般的に悪い形と考えられています。次のように唯一の名前空間内の特定のアイテムを公開別の方法がある:
using std::string;
string myString;
これは、意図せずにあなたが意図していなかった何かを露出させるリスクなしに、あなたが特に必要std
名前空間のアイテムのみを公開することができます。
名前空間が競合から混乱と名前を避けるために、コードをラップする方法です。たとえばます:
ファイルcommon1.hます:
namespace intutils
{
int addNumbers(int a, int b)
{
return a + b;
}
}
使用状況ファイル:
#include "common1.h"
int main()
{
int five = 0;
five = addNumbers(2, 3); // Will fail to compile since the function is in a different namespace.
five = intutils::addNumbers(2, 3); // Will compile since you have made explicit which namespace the function is contained within.
using namespace intutils;
five = addNumbers(2, 3); // Will compile because the previous line tells the compiler that if in doubt it should check the "intutils" namespace.
}
だから、あなたはusing namespace std
を書くときあなたはそれがの定義を見つけることができないなどの機能、のためstd
名前空間になります疑問がある場合は、コンパイラを語っているやっているすべて。それはcout
が完全std::cout
としてそれぞれを修飾することよりも速くなるように等の一般的な機能を、入力することができるという理由だけで、これは一般にコードの例(及び製造)で使用されます。
あなたはstd名前空間を使用して宣言する必要はありません。それは使用することは悪い習慣であり、あなたがSTDを使用する必要があります::あなたがSTDを入力したくない場合は::いつもあなたには、いくつかのケースでは、このような何かを行うことができます:
using std::cout;
はstd ::を使用することにより、あなたはまた、標準ライブラリを利用したプログラムの一部としない伝えることができます。どちらも、より重要な含まれます他の機能との競合があるかもしれないということです。
RGDS レイン
C ++標準ライブラリ内のすべてのファイルは、std名前空間内のすべてのエンティティを宣言します。
例えば:iostreamの中で定義されたcin,cout
を使用するには、
オルタナティブます:
using std::cout;
using std::endl;
cout << "Hello" << endl;
std::cout << "Hello" << std::endl;
何もない 必要 C++ 標準ライブラリの実装者で、ヘッダー ファイルを「新しい」スタイルと「古い」スタイルの両方で宣言するときにコードの重複を避けたい場合を除き、そうする必要があります。
// cstdio
namespace std
{
// ...
int printf(const char* ...);
// ...
}
.
// stdio.h
#include <cstdio>
using namespace std;
もちろん、この例は多少不自然です (プレーンなコードも同様に使用できます) <stdio.h>
そしてそれをすべてstdに入れます <cstdio>
)、 しかし ビャルネ・ストルストラップ 彼の中でこの例を示しています C++ プログラミング言語.
これは、名前空間内で宣言されたものを使用している時はいつでも使われています。 C ++標準ライブラリはstd名前空間内で宣言されています。したがって、あなたがしなければならない。
using namespace std;
あなたは別の名前空間内の関数を呼び出すときにそうように、名前空間を指定する場合を除きます:
std::cout << "cout is declared within the namespace std";
あなたは http://www.cplusplus.com/docでそれについての詳細を読むことができます/チュートリアル/名前空間/ に。