たとえば、C++の標準文字列クラスを使用する場合。#include<string>
ヘッダーファイルとソースファイルの両方に含める必要がありますか?
#include<string>
ヘッダーファイルだけに含めることはできませんか?
たとえば、C++の標準文字列クラスを使用する場合。#include<string>
ヘッダーファイルとソースファイルの両方に含める必要がありますか?
#include<string>
ヘッダーファイルだけに含めることはできませんか?
ヘッダー ファイルへのインクルードは、クラス定義レベルでの依存関係を示している可能性があります (たとえば、文字列を受け入れたり返したりしているなど)。この場合、インクルードをヘッダーに入れる必要があります。ただし、実装で文字列のみを使用している場合は、ソース ファイルにのみ含める必要がある場合があります。
ベスト プラクティスは、ヘッダー ファイルを必要とするすべてのヘッダーまたはソース ファイルに個別にヘッダー ファイルを含めることです。
必要なヘッダーを他のヘッダー ファイルを介して間接的にインクルードすると、将来のある時点でインクルードされたヘッダーをソース ファイルから引き出すときに、(間接的にインクルードされた) ヘッダーがないためにあいまいなコンパイル エラーが発生する可能性があるという欠点があります。
ファイルのインクルードは、インクルード ディレクティブをインクルードされたヘッダー ファイルの内容に置き換えることによって行われます (実際には、テキスト ストリームでの置き換えではなく、意味的に同等の操作によって行われる可能性があります)。
これは、ヘッダーに含まれるすべてのファイルがそのヘッダーを含むファイルに含まれることを意味するため、ヘッダーを 2 回含める必要はありません。
とはいえ、ファイルを含めるための多くのポリシーがあり、1 つを選択することは、何をする必要があるかよりも、何に焦点を当てているか、およびベスト プラクティスの問題です。
たとえば、ファイルで定義されているシンボルを使用するときは常に、完全性を求めてファイルを含めることができます。
また、ヘッダー ファイルをインクルードする前に、クライアント コードがヘッダー ファイルの依存関係を明示的にインクルードする責任を負うプロジェクト (低レベルのクロスプラットフォーム C ライブラリ) も使用しました。これは、ヘッダーの依存関係を明示的に維持し、ライブラリによってクライアントに課される隠れた依存関係の制限を (可能な限り) 排除/最小化するために行われました。
最終的には、あなた (および/またはあなたのチーム) 次第です。