第45回
複数のソースファイルからプログラムを作る~マルチモジュール開発の基本

独自のヘッダファイル

ソースファイルには、関数のほかに記号定数や構造体の定義が必要になります。ソースを分割した場合、これらを複数のソースから参照できるよう、別途独自のヘッダファイルを作成する必要が生じます。

共通の定義をまとめる

記号定数や関数の定義は特定の関数とだけ関連していることもありますが、多くの場合メインの処理といくつかの関数にまたがって関連してきます。

たとえば、これまでに取り上げてきた「タブ←→スペース変換処理」では、データの変換を行うための基礎的な情報をまとめた構造体を定義しましたが、これはメイン処理のほかにデータの入力と実際の変換処理で共通して必要になります。

機能・役割別に分割した複数のソースにまたがって必要な定義は、別途ヘッダファイルとして用意し、その定義を必要とするソースファイルの先頭部分で“#include”プリプロセッサ指令で取り込むようにします。

これまで、標準ライブラリ関数を利用するためにstdio.hやstdlib.hなどのヘッダファイルを#include指令で取り込みました。独自の処理のために作成した関数群で必要とされる共通の定義も、独自のヘッダファイルを作成して取り込むわけです。

externによる外部参照

ソースをモジュール別に分割した場合、ほかのモジュールで宣言されている変数や定義されている関数を参照する必要が生じます。これらは外部参照となるため、参照が必要となるモジュール内でextern宣言しなければなりません。

独自のヘッダファイルでは、外部参照される変数と関数をすべてextern宣言しておきます。externは識別子を
同じモジュール内で見つからなければ
ほかのモジュール内に存在するものとみなす
――という働きをするものなので、extern宣言された変数や関数が宣言と同じモジュール内に存在している場合は、外部ではなく内部参照となります。