C言語では、1つのファイル内で全てのプログラムを書く事ができますが、
プログラムの規模が大きくなると、機能ごとに複数ファイルに分け、
複数人での開発が一般的です。
例)
AさんとBさんが別々に開発し、Bさんが関数郡を作り、
AさんがBさんの作った関数郡を使うプログラムです。
Aさん担当:program1.c
#include <stdio.h>
void main(void) {
printf("足し算=%d\n", tasizan(10, 5));
printf("引き算=%d\n", hikizan(10, 5));
printf("かけ算=%d\n", kakezan(10, 5));
printf("わり算=%d\n", warizan(10, 5));
}
Bさん担当:program2.c
int tasizan(int a, int b);
int hikizan(int a, int b);
int kakezan(int a, int b);
int warizan(int a, int b);
int tasizan(int a, int b) {
return a + b;
}
int hikizan(int a, int b) {
return a - b;
}
int kakezan(int a, int b) {
return a * b;
}
int warizan(int a, int b) {
return a / b;
}
このままだと、Aさんのプログラムファイルでコンパイル警告かエラーが出ます。
tasizan, hikizan, kakezan, warizan 関数のプロトタイプ宣言がありませんから、
その関数が使えない事になります。
プロトタイプがないので、付け足してみます。
Aさん担当:program1.c
#include <stdio.h>
int tasizan(int a, int b);
int hikizan(int a, int b);
int kakezan(int a, int b);
int warizan(int a, int b);
void main(void) {
printf("足し算=%d\n", tasizan(10, 5));
printf("引き算=%d\n", hikizan(10, 5));
printf("かけ算=%d\n", kakezan(10, 5));
printf("わり算=%d\n", warizan(10, 5));
}
これなら、無事にコンパイルできます。
AさんのプログラムファイルとBさんのプログラムファイルには、
同じ関数のプロトタイプ宣言が記述されています。
もし、Bさんのプログラムで関数を1つ追加し、
Aさんのプログラムから使いたい場合、
当然、Aさんのプログラムコードにも
Bさんのプログラムコードにも修正が必要です。
今は2人での開発ですからそれほど大変ではありませんが、
数十人規模でのプログラム作成の場合、
大変な修正量となります。
この手間をなくしてくれる機能が.h(ヘッダファイル)と呼ばれるファイルです。
ヘッダファイルは、基本的に1つのソースプログラムに対して1つ作成し、
そのソースプログラムで定義される関数のプロトタイプ宣言、
記号定数、マクロなどを書き、
いろんなソースプログラムから #include命令により使用します。
上記のAさんBさんのプログラム例をヘッダファイルを使って修正してみます。
Aさん担当:program1.c
#include <stdio.h>
#include "program2.h"
void main(void) {
printf("足し算=%d\n", tasizan(10, 5));
printf("引き算=%d\n", hikizan(10, 5));
printf("かけ算=%d\n", kakezan(10, 5));
printf("わり算=%d\n", warizan(10, 5));
}
Bさん担当:program2.c
#include "program2.h"
int tasizan(int a, int b) {
return a + b;
}
int hikizan(int a, int b) {
return a - b;
}
int kakezan(int a, int b) {
return a * b;
}
int warizan(int a, int b) {
return a / b;
}
Bさん担当:program2.h
int tasizan(int a, int b);
int hikizan(int a, int b);
int kakezan(int a, int b);
int warizan(int a, int b);