ah、a.cpp、b1.h、b2.hの4つのファイルがあるとします。また、ahまたはa.cppのいずれかにb1.hとb2.hを含める必要があります。b1とb2はどこに含める必要がありますか?a.cppだけがb1とb2を必要としているとしましょう。
5 に答える
ヘッダーファイルに必要ない場合は、cppにインクルードします。
これにより、コンパイル時間が短縮され、モジュール間の依存関係を理解するのに役立ちます。
一般的なルールは、ヘッダーからの定義を使用しないヘッダー内にヘッダーを含めないようにすることです。
ヘッダーには必要なものだけを含めてください。
ahのクラス定義と関数宣言にはb1.hまたはb2.hが必要ですか?次に、必要なものを含めます。
それ以外の場合は、.cppにのみ含めます。
ファイルを含めるたびに、コンパイルにかかる時間が長くなることを覚えておいてください。
必要な場合のヒントを次に示します。
戻り値またはパラメーターを含める必要はありません。たとえば、ヘッダーファイルにインクルードする
std::string blahFunc(std::string a);
必要はありません(ただし、前方宣言が必要です)<string>
ポインタ型を含める必要はありません。前方宣言する必要があります。たとえば
randomType * f();
、randomTypeのヘッダーをヘッダーに含める必要はありません。あなたがしなければならないのは、class randomType;
参照は、前方宣言することもできます。
b1.hおよび/またはb2.hに、実際にahで使用されるstruct
やなどの定義がある場合(たとえば、パラメーターまたは戻り型として関数プロトタイプで)、ヘッダーの上部にそれらを含める必要があります。typedef
それ以外の場合、b1.h / b2.hがa.cppに内部的に使用される定義(プライベートメンバーなど)のみを提供する場合は、それをa.cppの先頭に含めます。
コンパイラがそのファイルを理解するために実際に必要なものだけをファイルに含めるようにしてください。(窓とは異なり、怪物があり<Windows.h>
ます。)
includeディレクティブは常に.h**ファイルに含める必要があると思います。a.cppファイルに入れる必要がある唯一のインクルードは
#include "a.hpp"
理由を理解するために、ボブが自分のプログラム内でコードを使用し、コードが公開されていない(つまり、ライブラリとしてのみ提供している)とします。その後、彼が見ることができるのはあなたのヘッダーだけです。ヘッダーに必要なものをすべて含めると、コードの依存関係を確認し、コードに必要なものがすべて揃っていることを確認できます。includeディレクティブを.c**ファイルに配置すると、コードがオープンソースでない限り(つまり、.c **ファイルにアクセスできる場合)、確認する必要のあるパッケージを確認できなくなります。インストールしました。