17

この質問は重複している可能性がありますが、良い答えが見つかりません。短くて簡単、私が宣言する必要があるもの

using namespace std;

C++ プログラムで?

4

12 に答える 12

44

C ++標準が受け入れられたため、実質的にすべての標準ライブラリはstd名前空間内にあります。したがって、すべての標準ライブラリ呼び出しをで修飾したくない場合はstd::、usingディレクティブを追加する必要があります。

でも、

using namespace std;

標準の名前空間全体を実際にインポートしているため、名前の衝突の可能性が多くなるため、これは悪い習慣と見なされます。コードで実際に使用しているものだけをインポートすることをお勧めします。

using std::string;
于 2010-02-07T20:16:28.813 に答える
22

その名前空間内のすべてに std:: をプレフィックスとして付けないようにするのは省略形です。

于 2010-02-07T20:13:52.017 に答える
7

技術的には、 Argument Dependent Lookup を使用できるようにするために、(名前空間全体または個々の名前に対して) usingを使用する必要がある場合があります。

を使用する次の 2 つの関数を考えてみましょうswap()

#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_swapforオブジェクトのstd::swap使用を好むにもかかわらず、常に呼び出します。zzz::swapzzz::X

smart_swapstd::swapフォールバックの選択肢として表示されます (たとえば、int で呼び出された場合) が、名前を完全に修飾しないため、zzz::swapADL for で使用され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;そのような場合、実装ファイルで使用されている場合、凶悪な犯罪は見つかりません(ただし、スワップの例のように、関数スコープに制限することもできます)。

using ステートメントをヘッダー ファイルに含めないでください。その理由は、これにより、問題のあるヘッダーの後に含まれる可能性のある他のヘッダーの名前空間が汚染され、制御できない可能性のある他のヘッダーでエラーが発生する可能性があるためです。(これには驚きの要素も追加されています。ファイルを含む人々は、すべての種類の名前が表示されることを期待していない可能性があります。)

于 2010-02-08T09:47:22.917 に答える
5

明示的stdに参照する必要なく、名前空間内のメンバーを参照する機能。std::member例えば:

#include <iostream>
using namespace std;

...
cout << "Hi" << endl;

対。

#include <iostream>

...
std::cout << "Hi" << std::endl;
于 2010-02-07T20:14:06.103 に答える
5

次のように言うべきではありません。

using namespace std;

これは、名前空間を使用することの全体的なポイントを打ち負かすためです (それを行うと、「名前空間の汚染」が発生します)。このトピックに関する有用なリソースは次のとおりです。

1) 「std」を使用するための標準規約に関する stackoverflow スレッド</a>

2)名前空間への移行に関する Herb Sutter の記事

3) Marshall Cline の C++ Faq lite からのFAQ 27.5 。

于 2010-02-07T20:30:21.163 に答える
3

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

std::cout << "I am accessing stdout" << std::endl;
于 2010-02-07T20:14:49.987 に答える
3

まず、usingCは名前空間をまったくサポートしていないため、Cではディレクティブは必要ありません。

名前空間で見つかったアイテムには、代わりにプレフィックスを付けることで直接アクセスできるため、C++ではusingディレクティブが実際に必要std::になることはありません。したがって、たとえば:

using namespace std;
string myString;

と同等です:

std::string myString;

使用するかどうかは好みの問題ですが、std名前空間全体を公開していくつかのキーストロークを節約することは、一般的に悪い形式と見なされます。名前空間内の特定のアイテムのみを公開する別の方法は次のとおりです。

using std::string;
string myString;

stdこれにより、意図しないものを意図せずに公開するリスクなしに、特に必要な名前空間内のアイテムのみを公開できます。

于 2010-02-07T20:18:53.117 に答える
1

名前空間は、混乱や名前の競合を避けるためにコードをラップする方法です。例えば:

ファイル 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

于 2010-02-07T20:30:32.050 に答える
0

C ++標準ライブラリ内のすべてのファイルは、std名前空間内のすべてのエンティティを宣言します。
例:cin,coutiostreamで定義されたものを使用するには

代替案:

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

于 2010-02-07T20:15:24.917 に答える
0

名前空間内で宣言されているものを使用している場合は常に使用されます。C ++標準ライブラリは、名前空間std内で宣言されています。したがって、あなたはしなければなりません

using namespace std;

次のように、別の名前空間内で関数を呼び出すときに名前空間を指定する場合を除きます。

std::cout << "cout is declared within the namespace std";

詳細については、 http://www.cplusplus.com/doc/tutorial/namespaces/を参照してください

于 2010-02-07T20:17:24.100 に答える
0

名前空間stdを使用して宣言する必要はありません。これを使用することは悪い習慣であり、std ::を使用する必要があります。std::と入力したくない場合は、常に次のようなことを行うことができます。

using std::cout;

std ::を使用すると、プログラムのどの部分が標準ライブラリを使用しているか、どの部分が使用していないかを判断することもできます。これは、含まれる他の機能との競合が発生する可能性があることよりもさらに重要です。

Rgds Layne

于 2010-02-07T20:19:20.540 に答える
0

C++ 標準ライブラリの実装者であり、「新しい」スタイルと「古い」スタイルの両方でヘッダー ファイルを宣言するときにコードの重複を避けたい場合を除き、何もする必要はありません。

// cstdio
namespace std
{
  // ...
  int printf(const char* ...);
  // ...
}

.

// stdio.h
#include <cstdio>
using namespace std;

<stdio.h>もちろん、例はいくらか工夫されています (plainを使用してすべて std in に入れることも同様にうまくいきます<cstdio>) が、Bjarne Stroustrupは彼の The C++ Programming Languageでこの例を示しています。

于 2010-02-08T11:21:20.190 に答える