0からのゲームプログラミング > ファイル分割

Back Next
更新日 2003.09.27
ファイル分割

 今までは、以下のように一つのファイルに複数の関数を書いていました。

サンプルコード Main.cpp

#include	<stdio.h>

// 関数のプロトタイプ宣言
void func(void);

void main(void)
{
        printf("main 関数が呼ばれました。\n");

        func();
}

void func(void)
{
        printf("func 関数が呼ばれました。\n");
}

実行結果
main 関数が呼ばれました。
func 関数が呼ばれました。


 特に問題はありませんが、もっと多くの関数を追加してファイルサイズが大きくなってくると、編集しにくくなってきます。例えば、スクロールバーのつまみが小さくなり過ぎて、ちょっと動かしただけでも大きくスクロールされてしまったりします。また、貧弱なマシンで開発しているとエディタが重くてイライラしたりします。

 そこで、ファイルを分割して開発しようという訳です。ファイル分割する理由として、上記の理由もそうなのですが、もっと大きな理由は、一つのファイルに対するコンパイル時間を減らす為です。また、複数人で開発するときに、一つのファイルを皆が一斉に編集するなんてことは考えられませんよね。


 それでは、もう一つファイルを作成してみましょう。メニューの「ファイル(F)」から「新規作成(N)」(Ctrl+N)を選択します。そして、Sub.cpp と入力してファイルを作成し、プロジェクトに追加します。ファイル名は何でも構いません。プロジェクトファイルがある位置に、2つの *.cpp ファイルがあることを確認して下さい。


サンプルコード Main.cpp

#include	<stdio.h>

// 関数のプロトタイプ宣言
void func(void);

void main(void)
{
        printf("main 関数が呼ばれました。\n");

        func();
}

サンプルコード Sub.cpp

#include	<stdio.h>

void func(void)
{
        printf("func 関数が呼ばれました。\n");
}


 実行結果は上と同じです。今まではビルド(メイク)で、コンパイルとリンクを一度にしていたと思います。ツールバーに「コンパイル」のボタンがありますよね。*.cpp のファイル毎に、コンパイルしても構いません。

 Debug フォルダの中を見てもらえば分かりますが、一つのファイル(*.cpp)をコンパイルすると、そのファイルと同じ名前で、オブジェクトファイル(*.obj)が作成されます。そして、リンクすると、そのオブジェクトファイル(*.obj)等から、実行可能ファイル(*.exe)が作成されます。


 #include の行や、関数のプロトタイプ宣言等、他のソースファイル(*.cpp)で何度も使う場合、同じことを書くのは面倒です。そこで、ヘッダファイル(*.h)を使うと便利です。ファイル(*.h)を新規作成して、プロジェクトに追加させます。ファイル名は何でも構いませんが、下の例では 「Sub.h」 と入力した場合です。


サンプルコード Main.cpp

#include	"Sub.h"

void main(void)
{
        printf("main 関数が呼ばれました。\n");

        func();
}

サンプルコード Sub.cpp

#include	"Sub.h"

void func(void)
{
        printf("func 関数が呼ばれました。\n");
}

サンプルコード Sub.h

#include	<stdio.h>

// 関数のプロトタイプ宣言
void func(void);

 実行結果は上と同じです。

 今までの解説では、ソースファイルから「コンパイル」と「リンク」をして、実行ファイルが作成されると説明してきました。実は、「コンパイル」することには、「プリプロセス」という前処理をされた後、「コンパイル」されることを指しているのです。

 # から始まる行が、プリプロセスをする指定になります。#include は、ファイルを取り込むことを表します。<ファイル名> と "ファイル名" と2種類の書き方があります。

 <ファイル名> は、標準ディレクトリ内で、ファイルを探します。
 "ファイル名" は、カレントディレクトリ(現在のディレクトリ)からファイルを探し、見つからない場合のみ標準ディレクトリから探します。

 標準ディレクトリがどこかというと、Micorsoft Visual C++ 6.0 を使っている場合には、メニューの「ツール(T)」から、「オプション(O)...」を選択。そして、「ディレクトリ」タブで確認出来ます。
 Borland C++ Compiler 5.5 を使っている場合には、setbcc を使って環境変数にパスを設定しました。普通は、「〜\borland\bcc55\Include」 が標準ディレクトリになっています。


 ヘッダファイル(*.h)は、ソースファイル(*.cpp)にインクルード(#include) して使います。そして、ヘッダファイルだけをコンパイルすることは出来ません。ヘッダファイルを書き換えた場合には、そのヘッダファイルをインクルードしている、すべてのソースファイルに対して再コンパイルしなければなりません。「ビルド(メイク)」ボタンを押すことで、それを自動でやってくれます。しかし、稀に自動ではうまく処理されず挙動がおかしくなることがあります。ソースは正しい筈なのに、どうも挙動がおかしい場合には以下の処理を行って下さい。
 Micorsoft Visual C++ 6.0 を使っている場合には、メニューの「ビルド(B)」から「リビルドR)」を選択します。
 BCC Developer を使っている場合には、ツールバーの「すべて保存(Shift+Ctrl+S)」ボタンを押してから、「再構築」ボタンを押します。


 ヘッダファイルのインクルードは、ソースファイルで使われるヘッダファイルのみをインクルードするのが基本です。なぜなら、使わないヘッダファイルまでも大量にインクルードしてしまうと、コンパイル時間が極端に長くなってしまうからです。

 

◆プリプロセス
 コンパイルの前に、ソースファイルに命令等を取り込む処理のこと。

◆プリプロセッサ
 プリプロセスする機能を持ったプログラムのこと。

◆環境変数
 環境変数には、コンピュータ環境に関する情報(プロセッサの数、オペレーティング システムのパス等)が設定されています。
 

【スポンサード リンク】


Back Next

0からのゲームプログラミング > ファイル分割