苦しんで覚えるC言語

最小限の分割


第1項:複数ファイルを使う理由

これまでプログラムを記述する時には、エディタのウィンドウに書き込んできましたが、
その時、常に1つの画面の中に全てのプログラムを記述してきました。
つまり、1つのファイルの中に全てのプログラムを記述してきたことを意味します。

この方法は単純なので、規模の小さなプログラムでは有効な方法です。
しかし、規模が大きなプログラムでは、1つのファイルに全てを書き込んでいると、
どこにどのプログラムがあるのかがわかりにくくなります。
更に、何人かで1つのプログラムを作ろうとする場合には、
1つのファイルに2人以上の人が同時に書き込むことは基本的に不可能なので、
2人以上でのプログラミングは事実上不可能になってしまいます。

この問題の解決には、複数のファイルに分割してプログラムを書く必要があります。
複数のファイルに分割することで、どこにどのプログラムがあるのかわかりやすくなり、
また、何人かで1つのプログラムを作ることも可能になります。

目次に戻る

第2項:ソースとヘッダーファイル

プログラムを複数のファイルに分割するとなるとなにやら難しそうですが、
実は、最初から無意識の内に分割してプログラムを作っていたのです。

printf関数などを使うには、#include <stdio.h> を先頭に記述する必要がありました。
実は、これこそがプログラムを複数のファイルに分割するということです。

#include疑似命令は、指定されたファイルの内容を取り込むという命令です。
そして、stdio.h は、printf関数などの様々な関数の宣言を含んでいます。
ここで重要なことは、stdio.h には、printf関数の宣言だけが書かれているだけであり、
実際のプログラムは、stdio.h の中には書かれていないと言うことです。
printf関数の実際のプログラムは、stdio.h とは別のファイルに記述されています。

stdio.h のような、宣言だけが書かれたファイルをヘッダーファイルと呼びます。
ヘッダーファイルには、拡張子として、.h をつけることが慣習となっています。
ヘッダーファイル
関数や変数の宣言のみが記述されたファイル。
拡張子は .h にすることが慣習となっている。
これに対して、実際にプログラムを記述するファイルをソースファイルと呼びます。
今までに記述してきたのは全てソースファイルです。なお、拡張子は .c とします。
ソースファイル
プログラムが記述されたファイル。
拡張子は .c にすることが慣習となっている。
ソースファイルとヘッダーファイルは、通常、1対1で対応するように作成します。
ソースファイルの中から宣言の部分を抜き出して、
同じ名前(拡張子だけ変える)にして、ヘッダーファイルを作成します。

目次に戻る

第3項:最小限のヘッダーファイル

前項では、ヘッダーファイルの意味について説明しました。
ここでは、実際に最低限の構成でヘッダーファイルとソースファイルを作成し、
第11章 で作成したsum関数を分割してみたいと思います。

まずは、sum関数を含むソースファイル、sum.cを作成してみます。
これは簡単なことで、第11章で作成した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 <stdio.h>
#include "sum.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つ以上のファイルを使う場合には、使うファイルを指定する必要があります。
設定は使用しているコンパイラによって多少異なります。


Borland C++ Compiler と Visual C++ Toolkit 2003 の設定
メニュー -> 実行 -> コンパイル時パラメータ を選択し、
コンパイル時パラメータの欄に、
-emain main.c sum.c
と打ち込みます。  
-emain とは、実行ファイルを main.exe と言う名前で作成させる命令です。  
後半の2つは、共にコンパイルするソースファイル名を指定しています。  
ヘッダーファイルはソースファイルでインクルードしているので不要です。  

LSI C-86 の設定
メニュー -> 実行 -> コンパイル時パラメータ を選択し、
コンパイル時パラメータの欄に、
-o main.exe main.c sum.c
と打ち込みます。  
-o main.exe とは、実行ファイルを main.exe と言う名前で作成させる命令です。  
後半の2つは、共にコンパイルするソースファイル名を指定しています。  
ヘッダーファイルはソースファイルでインクルードしているので不要です。  
設定を終えたら、早速コンパイルしてみます。  
コンパイルが終了し、今までと同様に実行されたと思います。  
stdio.hの時は設定不要
今までにも、stdio.h などにより無意識の内に複数ファイルに分割していたのですが、
その時は、コンパイラが自動的に設定していたので、
今回のように他のファイルを指定する必要などはありませんでした。

本格的なエディタでは
今回は、わざわざファイルを指定してコンパイルさせていますが、
本格的な(プロ仕様)開発用エディタを使用すると、全自動的で行ってくれます。
他にも様々な機能が付属しており至れり尽くせりで、とても快適です。

Windows用のプログラム開発用エディタでは、マイクロソフト社製の VisualC++ が定番です。
学割なら1万円を切る価格で購入出来るので、真面目に学習したい人は検討して良いでしょう。
※現在では Visual Studio C++ は無料で入手できるようになりました
この様に別のファイルに分けておくようにすれば、sum関数を直接書き込まなくても、
sum.h と sum.c のファイルをコピーして、先頭で #include "sum.h" とするだけで、
sum.c 内に含まれる関数を全て利用出来ます。
sum.c 内の関数がある場合を同じファイルにコピーするよりもすっきりしますし、
関数の名前と引数さえ決めておけば、他の人にその関数を作ってもらって、
後で一緒にコンパイルするという、多人数開発も実現できます。

目次に戻る