C言語 ヘッダファイルとは?複数ファイルでの開発

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);