ヘッダファイルって何?

まぁ、基本何ですが、よく分からなくなってしまったので(笑

C言語ではプロトタイプ宣言が必要

C言語では、その時点より定義が出てきていない関数を
使う事ができません。てかまぁ多くの言語系がそうですよね。


でも定義を後で(もしくは別ファイルで)書きたい事も
多々あるわけで、そういうときに「プロトタイプ宣言」
ってのを使います。


とりあえず関数の名前と型だけを教えておくってやつですね。
で、ヘッダファイルにはこのプロトタイプ宣言みたいなのが
たくさん入っていると考えるといいようです。

プリプロセッサの働き

ところでヘッダファイルを書くときには、

#include

というように#includeを使って書くわけですが、この「#」から
始まるトークン列のことを「プリプロセッサ」というそうです。
#defineとかもそれになります。


こいつの役割は、コンパイラにソースをかける前に別のソースを
その場所に展開する、という役割があるそうで。
多分defineだったら、指定した値に置き換えられてからコンパイラ
かけられる模様です。


つまり、#includeは指定されたヘッダファイルの中身が
展開されるというわけ。
だから何のエラーも発生させずprintfとかいう「関数」を
使う事ができるわけですね。

リンカとかオブジェクトファイルとか

で、コンパイルすると実行ファイルが生成される前に
オブジェクトファイルってのが生成されます。
これはソースコード毎に生成されます。


で、あとでそれらを統合して(リンクして)実行ファイルが
できるわけです。


ヘッダファイルはこれらのオブジェクトファイルをつなぎあわせる
役割も担っています。いわゆる「分割コンパイル」です。

分割コンパイルとは

例えばすごく巨大なプログラムを組んだとします。
そうするとソースコードもすさまじい量になります。


ということは必然的にコンパイルする時間も延びまくるわけです。
でもそうすると生産性が低い。


そこで昔の偉い人は考えた。
「変更したモジュールだけコンパイルするようにできんかなぁ」
これがはじまりです。


この考え方に基づいて(かどうかは知らんけど)ソースファイル毎に
オブジェクトファイルを生成し、あとでリンカで統合するように
してやったわけ。
そうすると新しくコンパイルする必要があるのは変更したソースファイルのみとなって、
大幅に時間が短縮されるという寸法。


こういう事をしたいときに、ヘッダファイルに定義だけ書いておいて、
関数の実体は別のソースファイルにしておくと、一回作った
オブジェクトファイルは使い回せますよね。
おおこれは便利だ、と。それがヘッダファイルです。


下記を参考にさせていただきました。
というかすごくわかりやすい。ありがとうございます。


C言語入門 9.プリプロセッサとメイクファイル
http://c-production.com/contents/c/sec09.html


ヘッダファイル - Wikipedia
http://ja.wikipedia.org/wiki/%E3%83%98%E3%83%83%E3%83%80%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB