c-ファイルには何が必要で、h-ファイルには何が必要ですか?

同様の質問が、C言語でプログラムを開始している同僚から最近私に尋ねられました。 そして、それがこの問題についての私の理解を共有する良い理由だと思いました。 経験豊富なプログラマーでさえ、この点で常に同様の観点を持っているわけではないからです。



これは部分的に趣味の問題であるため、私がこれをどのように行うかに興味がある人は誰でも猫を歓迎します。



h-ファイルに関する「完全な真実」 gccプリプロセッサ記述の対応するセクションに含まれているという事実にもかかわらず、私はいくつかの説明とイラストを許可します。



そのため、文字通り、ヘッダーファイル(hファイル)は、いくつかのソースファイル(sファイル)で使用するためのC宣言とマクロ定義を含むファイルです。 これを説明します。

画像

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

画像

したがって、2つのファイルの共通部分を選択し、ヘッダーファイルに配置しました。

しかし、この場合、ヘッダーファイルはインターフェイスですか?



さらに、ヘッダーファイルで定義されたインターフェイスを実装するには、2つのsiファイルが本当に必要ですか? それとも1つで十分ですか?

この質問に対する答えは、インターフェイス関数の実装の詳細と実装の場所に依存します。 たとえば、ダイアグラムをより詳細に作成すると、インターフェイス関数が異なるファイルに実装されている場合のオプションを想像できます。

画像

そのような実装オプションは、高いコード接続性、低いテスト容易性、およびそのようなモジュールの再利用の困難につながります。

このような困難を避けるために、私は常にsiファイルとヘッダーファイルを1つのモジュールと考えています。 で、



したがって、上記の図に対応するコードを実装する機会があれば、次のことを達成しようとします(図の作成に使用したツールでドットを使用できないため、ファイル名の末尾_cおよび_hが追加されました):

画像

この図は、実際には2つの独立したモジュールを処理していることを示しています。各モジュールには、ヘッダーファイルの形式で独自のインターフェイスがあります。 これにより、この特定のケースで本当に必要なインターフェースのみを使用することが可能になり、さらに、これらのモジュールは互いに独立してテストできます。

読者は、ヘッダーファイルのマクロ2が両方のsiファイルへのコピーとして再び返されたことにおそらく気付いたでしょう。 もちろん、これは維持するのにあまり便利ではありません。 しかし、このマクロをインターフェイスの一部にすることは正しくありません。

そのような場合、複数のsiファイルに必要なタイプとマクロを含む別個のヘッダーファイルを作成することを好みます。

画像



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



資料にご関心をお寄せいただきありがとうございます。



All Articles