ヘッダーファイルに絶対に含まれてはならないものは何ですか?
たとえば、多くの定数を持つ文書化された業界標準形式で作業している場合、ヘッダーファイルで定義することをお勧めします(その形式のパーサーを作成している場合)。
ヘッダーファイルにはどの関数を挿入する必要がありますか?
してはいけない機能は何ですか?
ヘッダーファイルに絶対に含まれてはならないものは何ですか?
たとえば、多くの定数を持つ文書化された業界標準形式で作業している場合、ヘッダーファイルで定義することをお勧めします(その形式のパーサーを作成している場合)。
ヘッダーファイルにはどの関数を挿入する必要がありますか?
してはいけない機能は何ですか?
回答:
ヘッダーに入れるもの:
#include
ヘッダーがソースファイルに含まれている場合にヘッダーをコンパイル可能にするために必要なディレクティブの最小限のセット。ヘッダーに含まれないもの:
#include
ディレクティブ。これらの無償のインクルードは、再コンパイルする必要のないものの再コンパイルを引き起こし、時にはシステムがコンパイルできないようにすることができます。#include
ヘッダー自体が他のヘッダーファイルを必要としない場合は、ヘッダーにファイルを入れないでください。#include
変更される可能性のある関数、または大きすぎる関数のインライン定義。それらのインライン関数は、ファンアウトがあればほとんどありません。ファンアウトがある場合は、ヘッダーで定義されたものにローカライズする必要があります。#include
ステートメントの最小限のセットは何ですか?
これは重要な問題であることがわかりました。TL; DR定義:ヘッダーファイルには、直接使用される各タイプを直接定義するヘッダーファイル、または問題のヘッダーファイルで使用される各関数を直接宣言するヘッダーファイルを含める必要がありますが、他のものを含めることはできません。ポインターまたはC ++参照型は、直接使用とは見なされません。前方参照が推奨されます。
無償の#include
ディレクティブのための場所があり、これは自動テスト中です。ソフトウェアパッケージ内のすべてのヘッダーファイルに対して、次を自動的に生成してコンパイルします。
#include "path/to/random/header_under_test"
int main () { return 0; }
コンパイルはクリーン(つまり、警告やエラーがない状態)でなければなりません。不完全な型または不明な型に関する警告またはエラーは、テスト中のヘッダーファイルに欠落している#include
ディレクティブや転送宣言がないことを意味します。注:テストに合格したからといって、#include
ディレクティブのセットが十分であることを意味するわけではありません。
すでに言われたことに加えて。
Hファイルには常に以下を含める必要があります。
Hファイルには次のものを含めないでください。
static
。(また、どこでも、どこでも定数でないグローバル/外部変数を使用する理由はありませんが、それは別の投稿の議論です。)
私はおそらく決して「決して」とは言いませんが、データとコードが解析されるときにそれらを生成するステートメントは、.hファイルに入れないでください。
マクロ、インライン関数、およびテンプレートは、データまたはコードのように見える場合がありますが、解析されるためコードが生成されるのではなく、使用されるときに生成されます。これらのアイテムは多くの場合、複数の.cまたは.cppで使用する必要があるため、.hに属します。
私の見解では、ヘッダーファイルには、対応する.cまたは.cppへの最小限の実用的なインターフェイスが必要です。インターフェイスには、#defines、class、typedef、struct定義、関数プロトタイプ、およびグローバル変数のあまり好ましくないextern定義を含めることができます。ただし、宣言が1つのソースファイルのみで使用されている場合は、おそらく.hから除外し、代わりにソースファイルに含める必要があります。
意見の相違がある人もいるかもしれませんが、.hファイルに関する私の個人的な基準は、コンパイルする必要がある他のすべての.hファイルを#includeすることです。場合によっては、これは大量のファイルになる可能性があるため、インクルードファイルの大きなツリーを含めることなく、クラスのオブジェクトへのポインターを使用できるようにするクラスへの前方宣言などの外部依存関係を減らすための効果的な方法がいくつかあります。
ヘッダーファイルの構成は次のとおりです。
ヘッダーファイルにはオブジェクト定義を含めず、タイプ定義とオブジェクト宣言のみを含める必要があります。