質問

私はかなりヘッダを持つのポイントを理解していません。 DRY原則に違反しているようです!ヘッダ内のすべての情報は、実装に含まれる(ことができる)されている。

役に立ちましたか?

解決

これは、コンパイルプロセスを簡素化します。あなたが独立して単位をコンパイルしたいときは、他のすべてのファイルの全体をインポートすることなく、にリンクされます部品を記述するために何かを必要としています。

また、コードの隠蔽が可能になります。一つは、他の人が実装を配布することなく、機能を使用できるようにするヘッダを配布することができます。

最後に、実装からインタフェースの分離を促進することができます。

彼らは、これらの問題を解決する唯一の方法ではありませんが、30年前、彼らは良いものでした。私たちは、おそらく今日の言語のヘッダファイルを使用することはありませんが、彼らは2009年に発明されていませんでした。

他のヒント

などのJava、エッフェル塔やC#など、多くの現代語の建築家は明らかにあなたに同意 - これらの言語は、実装からモジュールに関するメタデータを抽出します。しかし、それ自体は、ヘッダの概念はそれを妨げるものではない - それは明らかに、これらの他の言語は、暗黙的に行うためだけのコンパイラと同様に、例えば、.hをコンパイル中.cファイルを抽出するために、コンパイラのための簡単な作業です。典型的な現在のCコンパイラはそれをしないという事実は、言語設計の問題ではありません - それは実装の問題です。どうやらそこに、このような機能のためのユーザによるいかなる需要がいないので、何のコンパイラベンダがそれを実装する気はありません。

言語設計の選択肢として、(人間が読めると編集可能なテキスト形式で)別の.hファイルを持つことはあなたの両方の長所を与える:あなたはまだ存在していないモジュールの実装に基づいて個別のクライアントコードをコンパイルを開始することができます、必要に応じて、手で.hファイルを書き込むことによって、またはあなたが(不条理で、それを提供するコンパイラの実装を想定して;-)それをコンパイルするの副作用として実装から自動的に.hファイルを取得することができます。

C、C ++、およびC、(どうやら彼らはまだ;-)今日元気、そして手動でヘッダを成長書いていないためにあなたのような需要している繁盛続ける場合は、

、最終的にはコンパイラの作家は、「ヘッダ生成」オプションを供給する必要がありますそして、「両方の長所は、」理論滞在しないでしょう - !)

これは、cが、書かれていたと言ったときに、使用可能だったコンピューターの能力について少し考えるのに役立ちます。メインメモリはキロワードで測定し、それらの必然的に非常に多くいませんでした。ディスクが大きく、しかしあまりありませんでした。本当に彼らが狩りにwumpusのをプレイできるように、あなたは離れて行きたかった気難しい事業者によって、手作業で取り付けられたオープンリールのテープを、意味Serriousストレージ。 1台のMIPSマシンはの速い叫んのでした。そして、これらすべての制限では、のシェアのそれに持っていました。おそらく、他のユーザーのスコアます。

コンパイルの

スペースを削減何かまたはの時間複雑さが大きな勝利でした。そして、ヘッダは、両方やるます。

ヘッダが提供するドキュメントを忘れないでください。あなたはモジュールを使用するために知っておく必要があり、それには何も通常はあります。ヘッダファイル - 私は私の部分のために、私が使用する必要があり、それを呼び出す方法を...あなたが効果的になり、とにかくこの情報を抽出することをそこにあるものを学ぶためにlooongソースコードをスキャンする必要はありません。もはや当然の近代的なIDE、と問題ありませんが、私は本当に使用状況に関する及び事前・事後条件に関するコメントを含んで手作りのヘッダファイルを持っているのが大好きいくつかの古いCコードで作業します。

ソース、ヘッダと同期して、追加のドキュメントを維持することは依然としてワームの別の缶である...

言語プロセッサのバイナリ出力ファイルを検査の全体的なアイデアは、Cが.hファイルを発明したときに理解するのは難しいされていると思います。そこそれのような何かをした陽気のと呼ばれるシステムでしたが、それはエキゾチックでmore-限られましたまたはレス専用の軍事プロジェクトへ。 (私は唯一それについて聞いた、陽気なプログラムを見たことがありません。)

Cが出てきた時に

だから、モジュール化のための通常のデザインパターンは、「一切のチェック」でした。そこ.DATAするの.textと.dataのためのシンボルができる唯一のリンクを.textの制限も、それはそれだったかもしれません。それは、その日のコンパイラは通常、一度に一つのソースファイルを処理した後、リンカーは、あなたがラッキーだったら、私は」対「私は関数シンボルだ」、以外のエラーチェックのわずかなレベルなしでそれらを一緒に入れて、ありますデータシンボル」ます。

だから、実際にコンパイラを持っていることのアイデアは、あなたが呼んでいたものが、やや新しいだった理解しています。

あなたは完全に偽のヘッダを作成する場合は、

今日でも、誰が最も AOTコンパイラ。 CLR言語やJavaのような巧妙なものは、実際にクラスファイルで物事をエンコード行います。

そうです、長い目で見れば、我々はおそらくヘッダファイルを持っていません。

はありません、あなたはJavaでヘッダを持っていけない - しかし、あなたは、インターフェイスを持っていると私は、すべての深刻なのJavaの第一人者は、インターフェイスと実装として他のプロジェクト/システムによって使用されるものを定義する推奨しています。

の定義はコール署名、型定義とあらわす定数を含むJavaインターフェースを見てみましょう。

MOST Cヘッダファイルは、コールサイン、型定義と定数が含まれています。

のためのだから、すべての実用的な目的でC / C ++のヘッダファイルは、単にインタフェース定義されているので、良いことを考慮すべきです。今、私も(MARCROs、定数などなど)ヘッダファイルに無数の他のものを定義するためにその可能性を知っているが、Cの全素晴らしい世界のほんの一部: -

int function target () {
    // Default for shoot
    return FOOT;
}
scroll top