web-dev-qa-db-ja.com

ヘッダーファイルを作成する必要があるのはなぜですか?

ぎこちないコメントを出す前に、私は知っています-これはヌービーの質問です。これは、Cベースの言語を使用するのが初めてです。

私は、モバイル開発に関するコンピューターサイエンスコースのObjective Cを学ぶ学部生です。アカデミックな環境では、小さなプロジェクトを構築したり、小さなチームで作業したりするため、実際の考慮事項はそれほど必要ないことは知っています。

しかし、私たちの教授は、すべての.m実装ファイルに対して.hヘッダーファイルを要求し、XCodeはサポートしています。私にとっては、忙しい仕事のようです。すべてのメソッドシグネチャとインスタンス変数を他のファイルに確実にコピーする必要があります。 1つのファイルを変更する場合、他のファイルと整合性があることを確認する必要があります。そのような小さな煩わしさの集まりのようです。

しかし、ヘッダーファイルにはsome実世界での使用が必要であることは知っています。素晴らしい答えは両方に対処します:

  1. 実装ファイルが適さない場合に役立つヘッダーファイルは何ですか?その目的は何ですか?
  2. プログラマーとしてヘッダーファイルを手動で作成する必要があるのはなぜですか?簡単に自動生成できるようです。

前もって感謝します!

12
Hartley Brody
  1. 要するに;

    • ヘッダーファイルは、モジュールのAPIを定義します。サードパーティが呼び出すことができるメソッドは、契約リストです。このモジュールは、サードパーティにとってブラックボックスと見なすことができます。

    • 実装はモジュールを実装します。ブラックボックスの内側です。モジュールの開発者としてこれを書く必要がありますが、サードパーティのモジュールのユーザーとしては、実装について何も知る必要はありません。ヘッダーには、必要なすべての情報を含める必要があります。

  2. ヘッダーファイルの一部は自動生成される可能性があります-メソッド宣言。 APIの一部を構成せず、ヘッダーに属さないプライベートメソッドが実装にある可能性が高いため、これには実装に注釈を付ける必要があります。

ヘッダーファイルには、他の情報が含まれていることがあります。型定義、定数定義など。これらは実装ではなくヘッダーファイルに属します。

9
Luke Graham

ヘッダーの主な理由は、#includeそれを別のファイルで使用すると、あるファイルの関数を別のファイルから使用できます。ヘッダーには(のみ)使用関数自体ではなく、関数を含めることができるので十分に含まれているので、(私たちは)コンパイルがかなり高速であることを願っています。

2つを別々に維持することは、プロセスを非常に適切に自動化するエディターを誰も作成したことがないために生じるほとんどの結果です。彼らがそうする理由はそれほど多くはありませんそうすることはできませんそしてそうする人もいます-しかし、そうしたことのある編集者は市場で非常にうまくやったことがなく、より主流になっています編集者はそれを採用していません。

5
Jerry Coffin

ヘッダーを含めると、他の場所で記述され、ソフトウェアプロジェクト/ビルドの一部である場合とそうでない場合があるが、ソフトウェアをビルドしているときに「リンカー」によって見つけられる関数またはメソッドをコードで呼び出すことができます。

たとえば、標準Cライブラリの関数を呼び出す場合、その関数のすべての内部をプロジェクト内に配置する必要はありません。単に、プログラムがそれを呼び出すことができることを期待します。

ただし、コードを認識できず、ヘッダーがそれを行う場合でも、関数はどこかに存在することをコンパイラに通知する必要があります。コンパイラーが完了すると、リンカーが呼び出され、ライブラリー呼び出しなど、ぶら下がったままになっているコードのビットを「リンク」するように見えます。

2
adrianmcmenamin

ヘッダーファイルは主に、他のファイルで関数のシグネチャ(関数名、戻り値、引数など)を宣言して含めるために使用されます。コンパイラーは、ファイルを一緒にコンパイルおよびリンクするときに、これらの署名を知っている必要があります。

詳細は this の記事を参照してください。

1
Bernard