分割したプログラム記述
ちいさなプログラムを書いているうちは、
一つのファイルにプログラムの全てを放り込んでしまっても、
やっていけないことはありません。
ただ、プログラムが大きくなっていく場合、
プログラムはその部位や機能に合わせて分離して記述する方が、
分かりやすく、保守しやすくなります。
例えば、プログラムを A という部分と B という部分に分離出来る場合、
A, B の境界をしっかり定めた上で、その中身をそれぞれ実現する方が、
- 複数グループが独立して開発できる
- 各部位で問題が起きたときや実装を改良する際に独立して対処できる
- 各部位のソースを他者に公開したくない場合有利
などの利点があるわけです。
皆さんのプログラムと標準ライブラリが分離しているのもその例です。
別の例としては、僕が出題プログラムを出して、
皆さんに回答プログラムを作ってもらうなんてことも可能なわけです。
で、C 言語の場合も、
プログラムを複数の部分に分割してコンパイルすることができるようになっています。
その方が、各ファイルのコンパイル時間が短くなるというメリットもあります。
C 言語では、各部分(A や B)を作成する場合、
その宣言と実装を分離して記述する事になっています。
つまり、部分 A を利用する側のための部分と、実際に部分A の中身を記述する部分です。
- *.h file (header files): (外部に公開したい)仕様を記述する部分
大域変数や関数の宣言を行い、また構造体の型定義なども行う部分。
利用者は、このファイルをincludeすることで、宣言を取り込む
- *.c file (source files): プログラムの実装に関する部分
大域変数の定義をおこなったり、関数の定義を行う部分
一方で、コンポーネントB側で、A のコンポーネントを利用したい場合は、
- A.h を include することでその宣言を取り込み、
- A.c からできあがったオブジェクトファイル A.o 中の関数群を、
link して使う
という具合いになるわけです。
普段、皆さんが標準ライブラリを利用するのも同じです。
例えば、printf() という機能を使いたいから、
stdio.hをinclude する事で宣言を取り込み、
標準ライブラリとリンクされることで、その機能を使うというわけです。
2001.10.19/
Tomio KAMADA: kamada@cs.kobe-u.ac.jp