http://d.hatena.ne.jp/fkm/20061128/p1
今回の場合はmain.cでのみ使うという状況を想定したが、これがかなり複数のファイルからmatrix.cの中の関数が呼ばれるという状況となるとプロトタイプ宣言を各ファイルごとに記述するのは面倒。
C言語の場合、面倒さの回避だけでなく、リンク時型チェックがないから、正確にコンパイル時型チェックをするという意味もある。
たとえば、
//hoge.c int hoge_add(int a, int b) { return a + b; } //main.c int hoge_add(int a); /* 間違い!!! */ int main(void) { hoge_add(3); }
みたいなプログラムが、エラーどころかWarningすら出ずに通ってしまい、hoge_add()の引数bには何が入るか判らない。
こんなバグしないって?関数に引数を追加したときに、その関数を呼んでいるところを見逃しても全然判らないよ?
ヘッダファイルにプロトタイプ宣言を置き、実装するソースと参照するソース両方が同じヘッダファイルをincludeするようにすると、プロトタイプ宣言に合致しない参照や実装をコンパイルエラーにすることができる。共通の宣言でコンパイル時型チェックをすることで、リンク時型チェックが無いのをカバーするというのが、ヘッダファイルにプロトタイプ宣言しないといけない理由。