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


12

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

私は、モバイル開発に関するコンピューターサイエンスコースのObjective Cを学んでいる学部生です。アカデミックな環境では、小規模なプロジェクトを構築したり、小規模なチームで作業したりするため、多くの現実世界の考慮事項は必要ありません。

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

しかし、私はがなければならない知っているいくつかのヘッダファイルの実際の使用。素晴らしい答えは両方に対処します:

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

前もって感謝します!


XCodeは自動リファクタリングをサポートしていますか?ヘッダーの署名を変更すると、実装に自動的に反映されます(またはその逆)。それとも、それをサポートするプラグインがありますか?手動で行うのは苦痛です。
FrustratedWithFormsDesigner

ヘッダーファイルについて学んだときの最初の反応は、「それを自動的に行う方法が必要だ」というものでした。それを支援するツールを探してみたとき、私はかなり困惑しましたが、すばらしい明確な選択肢は見つかりませんでした。
ハートリーブロディ

そのような機能が存在しないことに驚いています。EclipseがJavaに対してこのようなリファクタリングを行えることは知っていますが、C / C ++プラグインがheader / implリファクタリングを行えるかどうかはわかりません。XCode用のそのようなツールが存在しない場合、開発する価値があるものと思われます。;)
FrustratedWithFormsDesigner

回答:


9
  1. 要するに;

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

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

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

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


しかし、誰かが私のコードを使用する必要があり、.hファイルにしかアクセスできない状況になったのはいつですか?彼らはそれを実行するために.mがまだ必要ではないでしょうか?
ハートレーブロディ

1
実装の詳細を変更する場合に備えて、理論レベルでの抽象化の必要性を理解していますが、このような状況がいつ発生するかはわかりません。
ハートレーブロディ

10
場合によっては、通常は商業的な理由で、誰かにコードの使用を許可したいが、実装にはアクセスできないようにすることができます。この場合、ヘッダーファイルと、既にコンパイルされているライブラリまたはオブジェクトコードを提供します。
ルークグラハム

ええ、わかりました。コードはすでにコンパイルされているとは考えていなかったため、使用できますが、読み取りはできません。ありがとう!
ハートレーブロディ

3
また、なぜコードの使用方法を知るために実装を読みたいのでしょうか?ヘッダーファイルを読み取るのに十分なはずです。
ヨハンソン

5

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

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


2

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

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

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


1

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

詳細については、この記事をお読みください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.