今回は分割コンパイルについて説明します
分割コンパイルとは複数のC/C++ソースファイルをまとめてひとつの実行ファイル(.exe)を作成する方法です
いままではひとつのソースファイル(main.cpp)だけでプログラムを作成してきました
VC++では複数のソースファイル(.cpp)に関数、クラスなどを分割することで
他のプロジェクトでそのソースファイルを使いまわしたりすることで関数やクラスを再利用することができます
再利用できるよく使う機能などをまとめたソースファイルなどをライブラリと呼びます

プログラムの規模が大きくなってきたときやライブラリを作成する、
あるいは複数人で作業を分担するときにはソースファイルを分けて作業する必要がでてくるので
必ず覚えてください

前提としては
main関数(もしくはWinMain関数)は必ず1つのプロジェクトにつき1つしかありません
というのはmain関数がプログラム全体の開始となる関数なので
複数のソースファイルにそれぞれmain関数があると「どこから開始するの?」ってコンパイラに怒られます
なので、ライブラリにはmain関数は含めません

では、早速分割コンパイルをやってみましょう
いつものように空のプロジェクトを作成します
空のプロジェクトの作り方はVC++便利機能で説明しています

まず、ヘッダーファイル(.h)を作ります
ヘッダーファイルとは#include <stdio.h>とかのアレです

フォルダ内で右クリック→新規作成→テキスト(.txt)
でまず、テキストファイルを作成します
&ref(text.GIF);

拡張子が表示されてない人は
XPの人はツール→フォルダオプション

XPの人は「ツール」→「フォルダオプション」
Vistaの人は「コントロールパネル」内の「デスクトップのカスタマイズ」→「フォルダオプション」
で開き、「表示タブ→登録されている拡張子は表示しない」のチェックをはずして
拡張子を表示するようにしてください
この設定をすることで後のファイルの名前の変更で拡張子を変更することができます
ファイルの種類の識別がしやすいのでセキュリティ的にも表示したほうがよいです
&ref(fileop.GIF);

作成したファイルを右クリック→名前の変更で拡張子(.以下)を.txtから.hに書き直してやります
ここではtest.hにでもしましょうか

拡張子はファイルの種類を識別するためのもので
実際にはファイルというのは「テキスト形式」もしくは「バイナリ形式」の2種類しかありません
拡張子に惑わされないでください
「テキスト形式」は文字で書かれているファイルのことです
「バイナリ形式」は画像ファイルや音声ファイルなどコンピュータが直接認識できるような数値列になっているデータを指します、広義な意味では文字コードと呼ばれる数値を文字に変換している「テキスト形式」も包括していることになります
(文字化けが起きるのは読み込みの文字コードが合わないときに起きます)
プログラムを文字で書く、ソースファイルやヘッダーファイルは当然テキスト形式です

ここまで説明しておいてなんですが、
いちいち、テキストファイルを新規作成して拡張子変更がめんどくさいので
VC++では簡易的に次の方法でソースファイルやヘッダファイルを新規作成できます
&ref(DivideSource.GIF);
ここでtest.hを作成してください
また、さらにtest.cppを作成してください

追加したら次のコードを書いてください

#ifndefと#defineで定義している部分を
インクルードガードといいます
なぜ、こんなことをする必要があるのか?
というのを知るためには#includeについて知る必要が出てきます
実は#includeはプリコンパイル時に
ただ単にファイルをまるごとコピー&ペーストして張り付けているにすぎません
したがって次のような状況が起きた場合
&ref(DefineError.GIF);

同じ関数やクラス、変数などを多重に定義してしまうことになるのです
気を付けてほしいのは#includeしたファイルに#includeがある場合、さらにそれも展開されます
ここでインクルードガードを付けていれば
次のように防ぐことができます
&ref(DefineOK.GIF);

ソースファイル(.cpp)毎にコンパイルされることも覚えておいてください

VC++ではインクルードガードの方法に#pragma onceを使う方法があります
これは#includeで多重に同じファイルを展開しないことを
プリコンパイラに知らせているものです

ただ他の環境下(linuxやMac)では#pragma onceは存在しないので
他環境下では#ifndefと#defineを使って書く必要が出てきます

また、たまに拡張子に(.hpp)というのも見かけたりします
これは普通のヘッダーファイル(.h)と変わりません
ただ、実装を含んでいるヘッダーファイル(インライン実装、テンプレートクラス、関数等)には習慣として付けておくとよいでしょう

#vote((^ω^)やったお[0],何これwww意味不すぎwww[0],。(`ω´#)。あぁん?最近、だらしねぇな[0])


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS