2

重複の可能性:
Cのヘッダーファイルのポイントは何ですか?

私はUNIXプロジェクトに取り組んでいます。多くの検索を行った後、複数のソースファイル間で共有する必要のあるコードを記述するために使用されるヘッダーファイルの使用を提案する人も少なくありません。

定義を1つのファイル(ヘッダーファイル)に一元化するのが最善です。

今私は2つの疑問を持っています:
1)単に.cファイルよりもヘッダーファイルを使用することの重要性は何ですか。この回答
から、ヘッダーファイルはオブジェクトファイルにコンパイルされていないことがわかります。次に、何が起こりますか(実際にはgccがそれらをどのように処理するか)?メリットは何ですか?私が共有した答えは何を指摘したいですか?

2)ヘッダーファイルを作成するための規則または規則は何ですか。私はこれだけを知っています:

ヘッダーファイルには通常、データ型、関数プロトタイプ、およびCプリプロセッサコマンドの定義のみが含まれています。

これだけを書くことはできますか?つまり、これは規則または慣習ですか?

ヘッダーファイルの書き方を学ぶための情報源を教えてもらえますか?

私はこれだけを見つけることができます-より大きなプログラムを書く-それは多くを含んでいません。または、より適切で最適化されたヘッダーファイルを作成するためのその他のヒントやスタイル。

4

2 に答える 2

2

1)ヘッダーファイルを使用すると、.cファイル間で情報(定義など)を渡したり、他の.cファイルに関数が存在したりできます。これにより、論理的に属するコードを1か所にまとめることができます。#includeディレクティブは、名前が付けられたファイルを、その名前が付けられたファイルの一部であるかのように扱います。これにより、多くの冗長な入力を省くことができます。

2)慣例では、#define、enum、および関数宣言を.hファイルに渡し、実際の関数コード(ときどき静的インライン関数を除く)を.cファイルに渡します。

ルールは次のとおりです。関数型プログラムになる限り、コンパイラが死なずに食べるものは、多かれ少なかれ許可されます。規則は、プロジェクトを理解可能で保守可能な状態に保つのに役立つように多かれ少なかれ存在します。

于 2012-04-12T11:59:49.037 に答える
0

ヘッダーファイルが役立つ理由(2)とその機能(1)を理解するのが最善だと思います。次に、従うべき規則を自分で決めることができます。

1)「include」ディレクティブには、ディレクティブで指定されたファイルが現在コンパイルされているファイルに完全に含まれているという効果があります。これは簡単なはずです。

2)一般的に、複数のCファイルに分割されたCプロジェクトを管理する方が簡単です。これは、サイズの理由(数千行のコードを含むプロジェクトについて考えてください-そのようなファイルをスクロールする方法)だけでなく、管理上の理由(プロジェクトで作業している複数の人について考えてください-責任を分割しやすい)が原因である可能性があります。

複数のCファイルプロジェクトでは、他のファイルから関数を呼び出す必要があります。例を挙げましょう:

fileA.c
int function_a() {
  uses somewhere function_b
}

fileB.c
int function_b() {
  uses somewhere function_c 
}

fileC.c
int function_c() {
  uses somewhere function_a
}

関数を呼び出すには、最初に関数を宣言(または定義)する必要があります。明確にするために、宣言は戻り型とパラメーターが指定されたときであり、定義はコードも指定されたときです。上記の例では、すべての関数が使用される前に定義されるように、あるCファイルを別のCファイルに「含める」ことができる方法はありません。したがって、関数を呼び出す前に、関数の「宣言」を追加する必要があります。そのような宣言をどこに追加できますか?fileA.cにfunction_cの宣言を追加すると、これを維持するのは非常に困難になります(このシナリオを数十のファイルにまたがることができるとすると、すべての宣言を追跡するのは非常に困難になります)。

同じことがタイプにも当てはまります。

この問題の解決策は、Cファイルごとに、プログラムの他のモジュールに必要なすべての関数(およびタイプ)を宣言する「ヘッダー」ファイルを作成することです。このファイルは、これらの関数を必要とする他のすべてのCファイルに任意の順序で含めることができ、関数を変更した場合に変更する必要があることがわかっている一元化された場所です。

于 2012-04-12T12:11:25.600 に答える