マクロ集やコンパイル条件集としてのヘッダファイルを作成する方法は見ました。ここでは「モジュール化」という立場からのプログラムの分割を見ます。
プログラムを作成する上で,機能や目的,役割別に関数を作成することはプログラムを構造化する上で必要不可欠です。しかし,関数の数が増加するにつれ,ソースファイルは次第に変更箇所を探すのも難しくなる程膨張します。そこで,一つの役割を主題にした関数群を別のソースファイルにまとめることが必要になってきます。そのようなソースファイルの分割を「モジュール化」と呼んでいます。
■プログラムの分割:例
分割前のプログラムが次のようになっていたとしましょう。
/* Example 16.0 */ #include <stdlib.h> #include <stdio.h> void myPrint(char *); int main (void) { char str[8] = "test"; myPrint(str); exit(0); } void myPrint(char *x) { printf("This is a %s.\n", x); }
このプログラムを,メインの処理部分(例えば,main.c
というファイル)とプリント関連部分(例えば,myPrint.c
というファイル)に分けてみます。
/* main.c */ #include <stdlib.h> void myPrint(char *); int main (void) { char str[8] = "test"; myPrint(str); exit(0); }
/* myPrint.c */ #include <stdio.h> void myPrint(char *x) { printf("This is a %s.\n", x); }
このような分割で main.c
の役割と myPrint.c
の役割分担が可能となり,ソースのメインテナンスが容易になります。実際,各々のソースファイルをコンパイルすることができます。
% cc -c main.c % cc -c myPrint.c
このコンパイルによってオブジェクト・ファイル main.o
と myPrint.o
が出来上がります。出来上がったオブジェクト・ファイルから実行ファイルを作ってみます。
% cc main.o myPrint.o
この作業によって,main.c
に使われている myPrint
関数は myPrint.c
で定義されている myPrint
関数になります。これを「リンク」(Link)と言っています。ここでは,関数だけでなく,オブジェクト(変数)についてもリンクさせるためのプログラミングを見ます。
* UNIX系 OS では,オブジェクトファイル間のリンクを行っているのはコンパイラではなく ld
である。man ld
を参照。