プログラムを複数のファイルに分割するとなるとなにやら難しそうですが、
実は、最初から
無意識の内に分割してプログラムを作っていたのです。
printf関数などを使うには、#include <stdio.h> を先頭に記述する必要がありました。
実は、これこそがプログラムを複数のファイルに分割するということです。
#include疑似命令は、指定されたファイルの内容を取り込むという命令です。
そして、stdio.h は、printf関数などのさまざまな関数の宣言を含んでいます。
ここで重要なことは、stdio.h には、printf関数の
宣言だけが書かれているだけであり、
実際のプログラムは、stdio.h の中には書かれていないと言うことです。
printf関数の実際のプログラムは、stdio.h とは別のファイルに記述されています。
stdio.h のような、宣言だけが書かれたファイルを
ヘッダーファイルと呼びます。
ヘッダーファイルには、拡張子として、.h をつけることが慣習となっています。
【ヘッダーファイル】
関数や変数の宣言のみが記述されたファイル。
拡張子は .h にすることが慣習となっている。
これに対して、実際にプログラムを記述するファイルを
ソースファイルと呼びます。
今までに記述してきたのはすべてソースファイルです。なお、拡張子は .c とします。
【ソースファイル】
プログラムが記述されたファイル。
拡張子は .c にすることが慣習となっている。
ソースファイルとヘッダーファイルは、通常、1対1で対応するように作成します。
ソースファイルの中から宣言の部分を抜き出して、
同じ名前(拡張子だけ変える)にして、ヘッダーファイルを作成します。
前項では、ヘッダーファイルの意味について説明しました。
ここでは、実際に
最低限の構成でヘッダーファイルとソースファイルを作成し、
第11章で作成したsum関数を分割してみたいと思います。
まずは、sum関数を含むソースファイル、sum.cを作成してみます。
これは簡単なことで、[第11章](11-03,html)で作成したsum関数をコピーするだけです。
/* sum.c */
int sum(int min, int max)
{
int num;
num = (min + max) * (max - min + 1) / 2;
return num;
}
次に、sum.c 内に含まれる関数を他のソースファイルから使えるようにするために、
sum.c から宣言部分を抜き出して、ヘッダーファイル sum.h を作成します。
sum.c 内に含まれる宣言はsum関数の宣言だけなので、これを記述します。
/* sum.h */
int sum(int min, int max);
これで、sum関数の分割は完了しました。
しかし、これではmain関数がないので、プログラムを実行できません。
そこで、main関数を含むソースファイル、main.c を作成します。
main.c の記述もほとんど第11章と同じですが、1つ異なる点があります。
今回、sum関数のプロトタイプ宣言は、sum.h に記述しているので、
sum.h を取り込まない限り、sum関数を使うことができません。
sum.h を取り込むのには、当然、#include疑似命令を使用します。
ただし、今まではヘッダーファイル名を <> で囲んでいたのですが、
自分で作成したヘッダーファイルを取り込むには、"" で囲むことになっています。
なお、#include疑似命令でヘッダーファイルを取り込むことを、
インクルードと言います。
【インクルード】
#include疑似命令でヘッダーファイルを取り込むこと。
/* main.c */
#include "sum.h"
#include <stdio.h>
int main(void)
{
int value;
value = sum(50, 100);
printf("%d\n", value);
return 0;
}
これで、main.c も完成です。
なお、main.c のヘッダーファイル、main.h は作成する必要はありません。
main.c 内に含まれる関数を他のソースファイルから使う必要はないからです。
さて、早速コンパイルして実行してみたいのですが、このままではコンパイルできません。
今まではエディタの機能によって、1つのファイルであれば自動的に指定されたのですが、
2つ以上のファイルを使う場合には、
使うファイルを指定する必要があります。
設定は使用しているコンパイラによって多少異なります。
とくに設定はいりません。
メニューからファイルを追加すれば、自動的に認識されるようになっています。
とくに設定はいりません。
プロジェクトにファイルを追加すれば、自動的に認識されるようになっています。
メニュー -> 実行 -> コンパイル時パラメータ を選択し、
コンパイル時パラメータの欄に、
-emain main.c sum.c
と打ち込みます。
-emain とは、実行ファイルを main.exe と言う名前で作成させる命令です。
後半の2つは、共にコンパイルするソースファイル名を指定しています。
ヘッダーファイルはソースファイルでインクルードしているので不要です。
今までにも、stdio.h などにより無意識の内に複数ファイルに分割していたのですが、
その時は、コンパイラが自動的に設定していたので、
今回のように他のファイルを指定する必要などはありませんでした。
この様に別のファイルに分けておくようにすれば、sum関数を直接書き込まなくても、
sum.h と sum.c のファイルをコピーして、先頭で #include "sum.h" とするだけで、
sum.c 内に含まれる関数をすべて利用できます。
sum.c 内の関数がある場合を同じファイルにコピーするよりもすっきりしますし、
関数の名前と引数さえ決めておけば、他の人にその関数を作ってもらって、
ファイルを送ってもらって、あとで一緒にコンパイルするという、
多人数開発も実現できます。
まあ、現代ではGit一択ですので、そんなことはしないのですが・・・