4

どの標準ライブラリに他のどのライブラリが含まれているのか混乱しています。iostreamそのようなものが含まれていると聞きostreamました。残念ながら、概要が見つかりませんでした。そういうわけで私は今尋ねます。

私のプログラムは次のライブラリを使用しています:fstreamstring iostream、、、、、。それらは関連する機能を提供するので、これらのいずれかにすでにそれらの別のものが含まれているのではないかと思います。この場合、冗長なインクルードを取り除くことができます。sstreamstreambuf

どの標準ライブラリにどれが含まれているかを示す概要はありますか?または 私のプログラムのどのライブラリユーザーが冗長ですか?

4

5 に答える 5

7

C ++は、一般に、あらゆる種類の再帰的包含を保証するものではありません。必要なすべてのヘッダーを常に含めるのはユーザーの責任です。同様に、特定の標準ライブラリヘッダーが含まれていないことを保証するものではありませ。(たとえば、実装には合法的に常にすべての標準ライブラリヘッダーを含めることができます!)これが理由であり、すべてがstd名前空間にあるためです。

(Cライブラリヘッダーには特別な規定があると思います。これらのヘッダーを明示的に含めない限り、グローバル名前空間で名前を取得することはできないと思います。)

一部のヘッダーには特定の要件があります。たとえば、C ++ 11(以前はそうではありません)では、と<iostream>の両方を含める必要が<ostream>あり<istream>ます。しかし、それは1つの特定のケースにすぎません。

于 2012-10-08T14:04:11.550 に答える
2

他のヘッダーに含まれているヘッダーに依存することはできません。必要なものすべてを明示的に含めるのが最善です。そうすれば、コンパイラを変更した場合でも、新しいコンパイラに同じヘッダーインクルード構造がない場合でも、コンパイルを中断しないようにすることができます。

于 2012-10-08T14:04:45.987 に答える
1

私のルール:#includeあなたが使っているもの。を使用している場合はstd::string、を使用する必要があります#include <string>。を使用している場合はstd::cout、を使用する必要があります#include <iostream>。ファイルストリームを使用している場合は、#include <fstream>。等々。

含める他のシステムヘッダーのいくつかから「無料」で入手できることは関係ありません。std::stringインクルードの舞台裏に依存しないでください。

于 2012-10-08T14:07:08.283 に答える
1

これは役立つ場合があります:http: //www.cplusplus.com/reference/iostream/iostream/iostreamはostreamとistreamから継承されます。

于 2012-10-08T14:03:32.830 に答える
1

冗長なインクルードが心配な場合は、次のようなマクロを介して処理されます

#ifndef MACRO_NAME #define MACRO_NAME

#endif

だから、私が推測する複数のインクルードについて心配する必要はありません。

于 2012-10-08T14:34:24.343 に答える