これは部分的に趣味の問題であるため、私がこれをどのように行うかに興味がある人は誰でも猫を歓迎します。
h-ファイルに関する「完全な真実」 が gccプリプロセッサ記述の対応するセクションに含まれているという事実にもかかわらず、私はいくつかの説明とイラストを許可します。
そのため、文字通り、ヘッダーファイル(hファイル)は、いくつかのソースファイル(sファイル)で使用するためのC宣言とマクロ定義を含むファイルです。 これを説明します。

マクロ1と同様に、関数1と2が両方のファイルで言及されているのは簡単です。 また、ヘッダーファイルを含めると、各siファイルにコンテンツをコピーするのと同じ結果になるため、次のことができます。

したがって、2つのファイルの共通部分を選択し、ヘッダーファイルに配置しました。
しかし、この場合、ヘッダーファイルはインターフェイスですか?
- 機能1と2が別の場所に実装する機能を使用する必要がある場合は、はい
- マクロ2がUnit1.cおよびUnit2.cファイルでの使用のみを目的としている場合、インターフェイスファイルには場所がありません。
さらに、ヘッダーファイルで定義されたインターフェイスを実装するには、2つのsiファイルが本当に必要ですか? それとも1つで十分ですか?
この質問に対する答えは、インターフェイス関数の実装の詳細と実装の場所に依存します。 たとえば、ダイアグラムをより詳細に作成すると、インターフェイス関数が異なるファイルに実装されている場合のオプションを想像できます。

そのような実装オプションは、高いコード接続性、低いテスト容易性、およびそのようなモジュールの再利用の困難につながります。
このような困難を避けるために、私は常にsiファイルとヘッダーファイルを1つのモジュールと考えています。 で、
- ヘッダーファイルには、このモジュールのインターフェイスの一部である関数、型、マクロの宣言のみが含まれます。
- 次に、Cファイルには、hファイルで宣言されたすべての関数の実装と、インターフェイスの実装に必要なプライベートタイプ、マクロ、および関数が含まれている必要があります。
したがって、上記の図に対応するコードを実装する機会があれば、次のことを達成しようとします(図の作成に使用したツールでドットを使用できないため、ファイル名の末尾_cおよび_hが追加されました):

この図は、実際には2つの独立したモジュールを処理していることを示しています。各モジュールには、ヘッダーファイルの形式で独自のインターフェイスがあります。 これにより、この特定のケースで本当に必要なインターフェースのみを使用することが可能になり、さらに、これらのモジュールは互いに独立してテストできます。
読者は、ヘッダーファイルのマクロ2が両方のsiファイルへのコピーとして再び返されたことにおそらく気付いたでしょう。 もちろん、これは維持するのにあまり便利ではありません。 しかし、このマクロをインターフェイスの一部にすることは正しくありません。
そのような場合、複数のsiファイルに必要なタイプとマクロを含む別個のヘッダーファイルを作成することを好みます。

ヘッダーファイルに配置する必要があるエンティティを特定できたことを願っています。 また、インターフェイスと、いくつかのsiファイルに必要な宣言とマクロを含むファイルの違いを示します。
資料にご関心をお寄せいただきありがとうございます。