1.プログラム分割のメリット
ある程度以上の機能を持つプログラムを作成する場合、一つのファイルでコーディングすると、行数が膨大になり、全体の見通しも悪くなり、編集作業やデバッグの効率も悪くなる。そのような場合は、いくつかのファイルに分割してコーディングした方が編集・デバッグ効率が上がる。また、プログラムを分割することにより、一つのソフトウェアを複数人で開発することが可能になる。
2.プログラム分割の指標
プログラム分割にあたって、まずそのソフトウェアが持つ機能や責務を明確にし、それに応じたモジュール化を行う。
プログラム分割はこのモジュールをベースにして行う。
一つのモジュールをそのまま一つの分割プログラム(ファイル)に対応させることが多いが、一つのモジュールをさらに複数のファイルに分割したり、逆に複数の小さいモジュールを一つのファイルにまとめることもある。
一つのモジュールをそのまま一つの分割プログラム(ファイル)に対応させることが多いが、一つのモジュールをさらに複数のファイルに分割したり、逆に複数の小さいモジュールを一つのファイルにまとめることもある。
一つのモジュールは、出来る限り関連の強い処理だけをまとめ複雑な機能を持たせないようにし、また他のモジュールとの複雑なデータのやり取りがなく出来るだけ独立性が高い方がよい。前者を「凝集度が高い」といい、後者を「結合度低い」という。 凝集度が高く結合度が低いモジュールは、ソフトウェア部品として使いやすく、保守性もよくなる。
3.プログラム分割する変数と関数の扱い
プログラム分割した場合、変数と関数の扱いに関して次のことに留意する。
- プログラム間のデータの受け渡しは、グローバル変数で行うことが可能である。
- プログラムを関数単位で分割した場合は、関数の戻り値または関数の引数の受け渡しすることも可能である。
- 別のファイルに定義されている関数や変数・構造体は extern 宣言する。
例1: main.c でグルーパル変数 int abc ; を宣言し、それを sub.c で利用する場合は、sub.c で extern int abc; とする。
例2: sub.c で定義し た関数 void func() を main.c で利用する場合は、main.c で extern void func(); とする。
- モジュール構造がある程度以上複雑になってきたら、extern 宣言はヘッダファイルで行い、それを include するようにする。
グローバル変数とローカル変数
- グローバル変数は関数外で宣言し、ローカル変数は関数内で宣言する。
- グルーバル変数はプログラムまたはファイル全体で共通に使え得る変数
- ローカル変数は、その関数内のみで有効な変数
- 最近は保守性の観点からグローバル変数は出来るだけ使わないことが推奨されている。
- ローカル変数は通常その関数の処理を終えると値が破棄される(メモリ領域が削除される)が、static 宣言することによりその値が保持される。
例: static int var;
マクロ変数
-
#define 文で宣言させたマクロ変数は、プログラム全体で共通なのでどのファイルで宣言しても同じである。
ただし、グルーバル変数と同様に、最近は保守性の観点から出来るだけ使わないことが推奨されている。
4.Makefile
これまでは Makefile の TARGET_SOURCES のエントリに一つのファイルのみを記載していたが、ここに分割した複数のファイルをスペースで区切って列挙する。記載する順序は特に制限はない。例えば、ファイルを trace.c と calibration.c に分割した場合は次のように記述する。
TARGET_SOURCES = trace.c calibration.c
TARGET 名は複数にはしないこと!