多くのソース ファイルで std 名前空間のみを使用する C++ プロジェクト (VC++ 2008) がありますが、「using namespace std;」を配置する「正しい」場所が見つかりません。
main.cpp に入れると、他のソース ファイルには広がらないようです。これをヘッダーファイルに入れたときは機能していましたが、その後、それは悪いと言われました。すべての .cpp ファイルに配置すると、コンパイラは std 名前空間を認識しません。
これはどのように行うべきですか?
多くのソース ファイルで std 名前空間のみを使用する C++ プロジェクト (VC++ 2008) がありますが、「using namespace std;」を配置する「正しい」場所が見つかりません。
main.cpp に入れると、他のソース ファイルには広がらないようです。これをヘッダーファイルに入れたときは機能していましたが、その後、それは悪いと言われました。すべての .cpp ファイルに配置すると、コンパイラは std 名前空間を認識しません。
これはどのように行うべきですか?
あなたのヘッダーでは、メンバーの名前空間を完全に修飾するのが最善だと思います
#include <list>
class CYourClass
{
std::list<int> myListOfInts;
...
};
cpp のどの関数でも引き続き完全に修飾できます
int CYourClass::foo()
{
std::list<int>::iterator iter = myListOfInts.begin();
...
}
どこでも「名前空間 std を使用する」必要はありません。std:: を入力しすぎていることがわかった場合にのみ、「名前空間 std を使用する」をスローして、独自のキーストロークを保存し、コードの読みやすさを向上させるとよいでしょう。これは、ステートメントの範囲に限定されます。
int CYourClass::foo()
{
using namespace std;
list<int>::iterator iter = myListOfInts.begin();
...
}
通常、次の 3 つの選択肢があります。
最も一般的に受け入れられているベスト プラクティスは、#1 を使用することだと思います - メソッドがどこから来ているのかを正確に示します。
場合によっては、ファイルが名前空間からの取り込みに完全に依存しているため、ソース ファイルの先頭に using 名前空間を配置した方が読みやすくなります。怠け者であるためにこれを行うのは簡単ですが、この誘惑に屈しないようにしてください. 少なくとも、特定のソース ファイル内に配置することで、コードを管理している誰かに表示されます。
3 番目のインスタンスは、一般的に不適切な方法です。同じメソッドを定義している可能性のある複数の外部ソース ファイルに依存している場合、問題が発生する可能性があります。また、あなたのコードを保守している人にとっては、特定の宣言がどこから来ているのかわかりにくくなります。これは避けるべきです。
概要: スコープ付きインスタンス (std::Something) を使用することをお勧めします。これらの過度の使用によってコードの読みやすさと保守性が低下する場合を除きます。
using namespace std;
自分にとって便利だと思われるという理由だけで、コード全体に広めるのは良い考えではありません。しかし、それを主張する場合は、独自のコードをその名前空間にラップすることができます。そして、後で実際にメインファイルの関数/クラスを使用するときにのみ、を定義します using namespace std;
。私が言っていることを強調するために、ここに例があります:
namespace std
{
class MyNewClass
{
public:
MyNewClass( ) { out << "Hello there" << endl;};
};
};
int main( )
{
std::MyNewClass tmp;
};
複数の場所 (各 .cpp ファイル) に配置できます。
基本的に、次のいずれかを選択する必要があります。
using namespace std
1)すべての cpp ファイルに含めることによって「正しいことを行う」 、または
using namespace std
2)いくつかの一般的なヘッダー ファイルを追加します。
どちらが良いかは人それぞれ意見は分かれると思いますが、私に言わせればusing namespace std
、共通のヘッダーを入れることにしました。私の意見では、std名前空間はまさに「標準」であり、名前の競合は名前空間に依存するのではなく、コード レベルで解決する必要があります。
名前空間は他のファイルに「広がり」ません。各ファイルに配置するか、クラスを明示的に呼び出す必要があります。
また:
名前空間 std を使用します。何とか << x;
また:
std::blah << x;
選択はスタイルの選択であり、どちらかが実際に機能します。
コンパイラが名前空間を「認識」しない場合は、それを宣言する定義ファイルが含まれていないためです(つまり、 include )