1. ホーム
  2. c++

[解決済み] c++のヘッダーで "using namespace "を使用する [重複] [重複

2022-07-04 12:07:16

質問

私たちのc++のコースでは、すべての教師がいつも using namespace std; のすぐ後に #include の直後に .h ファイルに追加することができます。これは、他のプログラムでそのヘッダーをインクルードすることによって、私のプログラムに名前空間がインポートされることになるため、危険であると思われます。

ですから、私の質問は二重です。私が正しいのは using namespace はヘッダーファイルで使ってはいけないというのは正しいのでしょうか、そして/または、それを元に戻す方法はあるのでしょうか、このような。

//header.h
using namespace std {
.
.
.
}

もう一つ、同じような質問をします。ヘッダーファイルは #include は、対応するすべてのヘッダを .cpp ファイルが必要とするヘッダを、ヘッダ定義に必要なものだけにして .cpp ファイル #include として宣言するか、あるいは何もせず、必要なものすべてを extern ?

質問の理由は、上記と同じです。を含むときに驚かないようにしたいのです。 .h ファイルを含むときに驚かないようにするためです。

また、もし私が正しければ、これはよくある間違いなのでしょうか?私は、実際のプログラミングと、そこにある "real" プロジェクトにおいてを意味します。

ありがとうございます。

どのように解決するのですか?

このような場合、絶対に using namespace を使うべきではありません。まさにあなたが言うような理由で、そのヘッダを含む他のファイルのコードの意味を予期せず変えてしまう可能性があるからです。を元に戻す方法はありません。 using namespace を元に戻す方法がないのも、危険な理由のひとつです。私は通常、単に grep などで using namespace がヘッダで呼び出されていないことを確認するために、もっと複雑なことをするよりも。おそらく静的コードチェッカーもこれにフラグを立てます。

ヘッダは、コンパイルに必要なヘッダだけを含むべきです。これを強制する簡単な方法は、常に各ソースファイル自身のヘッダーを、他のどのヘッダーよりも先に、最初にインクルードすることです。そうすれば、ヘッダーが自己完結していない場合、そのソースファイルはコンパイルに失敗します。場合によっては、例えばライブラリの中の実装の詳細なクラスを参照するような場合、前方宣言の代わりに #include の代わりに前方宣言を使用することができます。

よくあることだと言えるかどうかはわかりませんが、間違いなくたまに現れます。たいてい、新しいプログラマが書いたもので、その悪影響に気づいていません。通常、リスクについて少し教育するだけで、修正するのが比較的簡単なので、どんな問題にも対処できます。