第三十四話 ファイル分割
「じゃ、最後にファイルの分割の話をして終わらせますか」
先輩の言葉に俺たちは反応する。
「ファイルの分割?」
「そう。今回のイツキくんが作ったプログラムは短いからいいけど、プログラムが長くなってきたら、一つのファイルにすべて詰め込むと、読みにくくなるでしょ? だから、そうなったら、プログラムを幾つものファイルに分割するのが実践的なやり方なのよ」
「なるほど」
「これはヘッダファイルってのを入り口にするんだけどね、.hって最後についているファイル」
「それって、includeでstdio.hとかのあれですか?」と西原さん。
「まさにそれ。ヘッダファイルは、関連するプログラムの窓口となるファイルなのよ。これをリンクするのがリンカって言うんだけど、コンパイルの最後にそれぞれのファイルをリンクするわけ」
「うーむ。そういう事もしていたのか」
「実際には、コンパイラは三つのプログラムに分かれているのよ。プリプロセッサ、コンパイラ、リンカ。で、コンパイラが行うのは、オブジェクトファイル、.oファイルってのを作るだけで、それを最後にまとめてリンクして、.exeのお馴染みの実行ファイルを作るわけ」
「こういうのは、普段は隠蔽されてるけどねー」と岸井先輩。
「じゃ、今回は簡単に、kazuate.hヘッダファイルを作るのと、kazuate.cの中の、game()関数を、別ファイル、game.cに分けてみましょう」
「うむむ。簡単ですか? 難しそう」
「大丈夫って。見た目よりも、実際はずっと簡単なんだから。じゃ、始めてみるよ」
先輩は、新たにメモ帳を開くと、コードを書き始める。
/* kazuate.h ヘッダファイル */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* 関数プロトタイプ宣言 */
int loadHiscore(void);
void saveHiscore(int);
void game(int);
/* グローバル変数 */
extern int score;
/* kazuate.c メインファイル */
#include "kazuate.h"
int score = 10;
int main(void)
{
(略)
}
「これだけですか? っていうか、メインファイルの先端を移動させただけでは」
「そ。簡単でしょ?」
「scoreの10への代入は、ヘッダファイルには書かないんですか?」と西原さん。
「ヘッダファイルじゃ、変数の定義とかはしないのが基本よ。もし入れてたら、複数のファイルからincludeされたとき、どっちの定義を使うのかで問題になるの。この変数scoreの前のexternは、コンパイラにこういう変数がありますよ、と伝えてるんで、実際の定義はkazuate.cの方でやるわけ」
「うーむ」
ややこしいなあ。
「イツキくん、まだ納得していない顔してるねー。ま、ヘッダファイルについては、複数のファイルやライブラリを扱わないかぎり、意味合いがわからないかもねー」
「とりあえず、Cのお約束として憶えておくといいと思う……」サヤちゃんが続ける。
「わかりましたよ」
「次はgame関数を別ファイルへ移動させるよー」
/* game.c */
#include "kazuate.h"
void game (int seikai)
{
(略)
}
「こっちでも、kazuate.hをインクルードするんだ」
「じゃないと、scoreとかグローバル変数が使えないでしょ? それにstdio.h入れないと、入力でエラーが出るし」
「これでもう動くんですか?」と西原さん。
「うん。じゃ、試してみますか」
先輩はコマンドプロンプトで入力をしていく。
C:¥sample>gcc -o kazuate kazuate.c game.c -Wall
C:¥sample>_
「あ、二つ入れるんだ」
「そう。これを忘れないでね。じゃ、実行してみよう」
先輩はkazuateを入れてエンターを押した。
するといつも通りにゲームはスタートする。問題はないようだった。
「よしよし。これでイツキくんもファイル分割の基本がわかったと思うわ」
「はい」
「あとは実戦を繰り返していくうちに、だんだんとわかってくるでしょ。プログラミングの上達は、実践の中からしか生まれないのよ」
「はい、俺はもっとやってみますよ」
そう言ってから、俺は改めて先輩に向かって言った。
「ところで先輩、これで俺は一週間以内にゲームを作れましたよね?」
「えっ……う、うん。そうね」
先輩が一瞬、慌てた表情を見せたのを俺の目は逃さない。
「じゃ、俺との約束、果たしてくださいよ」
「うっ……。そ、そんな約束、したっけー?」
この女、しらばっくれる寸法か!
「しっかりしましたよ。プロローグを読み返しましょうか?」
「うぅぅ……」
「え、なになに、アカネとの約束?」
岸井先輩が目を輝かしている。
「ええ。もし俺がゲームを作れたら、先輩は何でも一つ俺の言うことを聞くそうです」
「うわー。面白そうーっ!」
「ふっふっふっ」俺は口元に笑みを浮かべる。
「な、なにっ……」
先輩はびくりとして強張っている。
「先輩、じゃ、俺の願いを言いますよ。それは──」
衝撃のエンディングは次回なり!