それでは、ファイル分割について説明します。
何度も書きましたが、ソフトの開発などではプロジェクトチームを組んで複数のメンバーで開発することが常です。
大きいプロジェクトになるとプログラム量も膨大になり、作成しなければならない関数の量も多くなります。
各メンバーで手分けして開発する必要がありますが、これまでのように1つのcppファイルにプログラムを書く方法では対処しきれません。
そこで、複数のcppファイルにプログラムを分割して記述し、後で合体(リンク)させる方法を説明します。
この方法は、大規模なソフト開発だけでなく、個人で開発する時にも必要な考え方です。
個人で作ったプログラムを自分自身が使う場合は、あまり考慮しなくても良いかも知れません。
しかし、就職の採用試験などでプログラム作品を提出しなければならない場合、ファイル分割されていない作品は厳しい評価になると思います。
まずは、小さなプログラムから考えてみましょう。
ファイル分割ということは、2つ以上のcppファイルを使用するということです。
今回は1つのプロジェクト内に2つのcppファイルを作成してみます。
とりあえずプロジェクトを作成しましょう。
<プロジェクトの作成>
1つ目のcppファイル(名前:main.cpp)を追加します。
<main.cppの追加>
2つ目のcppファイル(名前:sub.cpp)を追加します。
<sub.cppの追加>
それぞれ別の人が担当するファイルだと思ってください。
cppファイルごとの役割を書いておきます。
main.cppの役割 |
main関数作成 引 数 なし 戻り値 int型 変数valueの宣言 valueの初期値を代入 関数ShowValueを呼び出す |
sub.cppの役割 |
ShowValue関数作成 引 数 int型変数value 戻り値 なし |
上記の役割に従って2つのファイルに関数を作成しましょう。
<sample program 159-01>
/* main.cpp */
int main(void) { int value; value = 12; ShowValue(value); return 0; } |
main.cppではprintf関数などを呼び出していませんので、stdio.hのインクルードは不要です。
<sample program 159-02>
/* sub.cpp */
#include <stdio.h> void ShowValue(const int value) { printf("value = %d\n", value); } |
プロトタイプ宣言は?と思った方もいると思いますが、順を追って説明します。
とりあえずは、この状態でsub.cppを選択し、コンパイルしてみてください。
※ビルドではなくコンパイルです。
sub.cppは特に問題ありませんね。
続いて、main.cppを選択してコンパイルしてみてください。
error C3861: 'ShowValue': 識別子が見つかりませんでした
ShowValue関数が見つからないというエラーです。
まだこの状態では、2つのcppファイルは関係の無い状態です。
同じプロジェクトに入っていてもファイルが異なれば、関係は無いということですね。
main関数のエラーが解消出来なければ、プログラムを実行することは出来ません。
2つのファイルに関連を持たせるため、新しいファイルについて説明します。
これまで、プログラムの冒頭に
#include <stdio.h> |
と何度も書いてきました。
これは、scanf関数やprintf関数を使うために、stdio.hというヘッダファイルをインクルードするという意味でした。
インクルード(include)とは「含む」という意味です。
プログラムを作成しているcppファイルにstdio.hというヘッダファイルを含むことによって、色々な関数が使えるようになっているのです。
このヘッダファイルが、2つ以上のcppファイルをつなぐために必要なファイルです。
今回作成した、main.cppとsub.cppにもヘッダファイルを作成し、2つのファイルを結合してみます。
では、ヘッダファイルの作り方から始めましょう。
cppファイルと同じように、プロジェクトメニュー → 新しい項目の追加 を選択します。
<新しい項目の追加>
「ヘッダーファイル」を選択し、main.hを追加します。
<main.hの追加>
2つ目のヘッダファイル(sub.h)を追加します。
<sub.hの追加>
追加されたヘッダファイルの中身を見ると最初からプログラムが書かれています。
#pragma once |
これについては、「インクルードガード」のところで説明します。
※Visual Studio Community 2015 での話です。
※書かれていない場合、今回は無くても大丈夫です。
main.cppに対してmain.hを、sub.cppに対してsub.hを作成しました。
同じ名前で作成したので、何かつながりがあるように感じますが、実はこれらも異なるファイルなのでお互い何の関係もありません。
具体的に、cppファイルとヘッダファイルを結合するコードを書かなければならないのです。
このコードはcppファイルに追加します。
<sample program 159-03>
/* main.cpp */
#include "main.h"
int main(void)
{
int value;
value = 12;
ShowValue(value);
return 0;
}
|
プログラムの先頭にmain.hをインクルードするコードを追加しました。
※自作したヘッダファイルをインクルードする時は「<>」ではなく「””」を使用します。
sub.cppにも同じように追加しましょう。
<sample program 159-04>
/* sub.cpp */
#include "sub.h"
#include <stdio.h>
void ShowValue(const int value)
{
printf("value = %d\n", value);
}
|
これで、main.cppとmain.h、sub.cppとsub.hがそれぞれ関連付けられました。
ただし、まだmain.cppとsub.cppは関連がありません。
具体的にヘッダファイルには何を書けば良いかというと、
他のcppファイルで使用する、 関数のプロトタイプ宣言 構造体宣言 他のヘッダファイルのインクルード |
などです。
まずは、sub.hから作成しましょう。
<sample program 159-05>
/* sub.h */
#pragma once void ShowValue(const int value); |
このShowValueはmain.cppで使用させたい関数です。
そのため、プロトタイプ宣言をヘッダファイルに記述します。
次にmain.hに移ります。
<sample program 159-06>
/* main.h */
#pragma once #include "sub.h" |
main.hでsub.hを含むことによって、sub.hに書いてあるShowValue関数のプロトタイプ宣言を含むことが出来ました。
プロトタイプ宣言を含むことが出来れば、sub.hとsub.cppは関連付けられていますので、ShowValue関数が呼び出せます。
では、main.cppを選択してコンパイルしてみてください。
エラーは無くなったはずです。
次にsub.cppを選択してコンパイルし、問題が無ければビルドして実行しましょう。
<実行結果>
value = 12 続行するには何かキーを押してください・・・
このようにして2つ以上のcppファイルをつなげてプログラムを作っていきます。
大きなプログラムになるとcppファイルもヘッダファイルも大量に必要になります。
とりあえず基本は終わりましたが、まだこれだけでは対応できない事が多く残っています。
次回も引き続きヘッダファイルについて説明します。