質問

この質問は重複している可能性がありますが、適切な答えが見つかりません。短くてシンプル、宣言しなければならないこと

using namespace std;

C++プログラムでは?

役に立ちましたか?

解決

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::swapzzz::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 ++ヘッダーに、それは(それが「名前空間の汚染」を構成するであろうこと)の名前空間を使用しての全体のポイントを打つため。このトピックに関するいくつかの有用なリソースは次のとおりです。

1)

2)にハーブサッターによって物品名前空間するへの移行

3) FAQ 27.5するからマーシャルクラインのC ++よくある質問ライトます。

すべての

まず、のこれはCで必要とされていないの - Cは、名前空間を持っていません。 C ++標準ライブラリのほとんどが含まれてstd名前空間で何かで。これを行わない場合は、そのように明示的に名前空間のメンバーにアクセスする必要があります:

std::cout << "I am accessing stdout" << std::endl;
Cは、すべての名前空間をサポートしていませんので、

まず、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でそれについての詳細を読むことができます/チュートリアル/名前空間/ に。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top