この質問は重複している可能性がありますが、良い答えが見つかりません。短くて簡単、私が宣言する必要があるもの
using namespace std;
C++ プログラムで?
この質問は重複している可能性がありますが、良い答えが見つかりません。短くて簡単、私が宣言する必要があるもの
using namespace std;
C++ プログラムで?
C ++標準が受け入れられたため、実質的にすべての標準ライブラリはstd名前空間内にあります。したがって、すべての標準ライブラリ呼び出しをで修飾したくない場合はstd::
、usingディレクティブを追加する必要があります。
でも、
using namespace std;
標準の名前空間全体を実際にインポートしているため、名前の衝突の可能性が多くなるため、これは悪い習慣と見なされます。コードで実際に使用しているものだけをインポートすることをお勧めします。
using std::string;
その名前空間内のすべてに std:: をプレフィックスとして付けないようにするのは省略形です。
技術的には、 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_swap
forオブジェクトのstd::swap
使用を好むにもかかわらず、常に呼び出します。zzz::swap
zzz::X
smart_swap
std::swap
フォールバックの選択肢として表示されます (たとえば、int で呼び出された場合) が、名前を完全に修飾しないため、zzz::swap
ADL 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 ステートメントをヘッダー ファイルに含めないでください。その理由は、これにより、問題のあるヘッダーの後に含まれる可能性のある他のヘッダーの名前空間が汚染され、制御できない可能性のある他のヘッダーでエラーが発生する可能性があるためです。(これには驚きの要素も追加されています。ファイルを含む人々は、すべての種類の名前が表示されることを期待していない可能性があります。)
明示的std
に参照する必要なく、名前空間内のメンバーを参照する機能。std::member
例えば:
#include <iostream>
using namespace std;
...
cout << "Hi" << endl;
対。
#include <iostream>
...
std::cout << "Hi" << std::endl;
次のように言うべきではありません。
using namespace std;
これは、名前空間を使用することの全体的なポイントを打ち負かすためです (それを行うと、「名前空間の汚染」が発生します)。このトピックに関する有用なリソースは次のとおりです。
1) 「std」を使用するための標準規約に関する stackoverflow スレッド</a>
2)名前空間への移行に関する Herb Sutter の記事
3) Marshall Cline の C++ Faq lite からのFAQ 27.5 。
まず第一に、これはCでは必要ありません-Cには名前空間がありません。C ++では、std
ほとんどの標準ライブラリを含む名前空間内のすべてのもの。これを行わない場合は、次のように名前空間のメンバーに明示的にアクセスする必要があります。
std::cout << "I am accessing stdout" << std::endl;
まず、using
Cは名前空間をまったくサポートしていないため、Cではディレクティブは必要ありません。
名前空間で見つかったアイテムには、代わりにプレフィックスを付けることで直接アクセスできるため、C++ではusing
ディレクティブが実際に必要std::
になることはありません。したがって、たとえば:
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
。
C ++標準ライブラリ内のすべてのファイルは、std名前空間内のすべてのエンティティを宣言します。
例:cin,cout
iostreamで定義されたものを使用するには
代替案:
using std::cout;
using std::endl;
cout << "Hello" << endl;
std::cout << "Hello" << std::endl;
名前空間内で宣言されているものを使用している場合は常に使用されます。C ++標準ライブラリは、名前空間std内で宣言されています。したがって、あなたはしなければなりません
using namespace std;
次のように、別の名前空間内で関数を呼び出すときに名前空間を指定する場合を除きます。
std::cout << "cout is declared within the namespace std";
詳細については、 http://www.cplusplus.com/doc/tutorial/namespaces/を参照してください。
名前空間stdを使用して宣言する必要はありません。これを使用することは悪い習慣であり、std ::を使用する必要があります。std::と入力したくない場合は、常に次のようなことを行うことができます。
using std::cout;
std ::を使用すると、プログラムのどの部分が標準ライブラリを使用しているか、どの部分が使用していないかを判断することもできます。これは、含まれる他の機能との競合が発生する可能性があることよりもさらに重要です。
Rgds Layne
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でこの例を示しています。