どのソースファイルからも iostream.h がインクルードされるとします。こういうとき、ソースファイル数だけ iostream.h は解析されることになります。iostream.h をいろいろ変更するのならともかくですが、そうでもないのに毎回解析するのは無駄な気がします。そこで、ツールによってはこの無駄をなくすことのできる機能がついています。
例によってVC++での話になります。ツールの違う場合は自分で読み替えて下さい。
それでは、今回の要点です。
では、いってみましょう。
複数のソースファイルを使用してプログラムを作るとき、どのソースファイルでも iostream.h をインクルードするということもあるでしょう。このとき、どのファイルでも iostream.h が展開され、いちいち解析されるというのは、時間の無駄な気がします。
さらに、iostream.h は標準のヘッダファイルであり、変更することはありません。毎回解析結果は同じなわけで、さらに時間の無駄な気がしますね。
「全く変更しない、よく使うヘッダファイルの解析時間を節約したい」と考えるのはごく自然なことです。
そこで、プリコンパイル済みのヘッダファイルというものを使用できることがあります。これは、全く変更しないヘッダファイルを作ってそれをあらかじめコンパイルしておき、次回からはその情報を再利用しようというものです。
VC++ ver 6.0 からはコンソールアプリケーション(第1部第1章参照)であっても初めから利用できるようになりましたが、一応今回は全てを手動でやってみたいと思います。
さて、先ずはプログラムの紹介です。内容をあまり考えないでいいように、第1部第11章のプログラムをベースにしています。今回は実行結果は重要でないので、実行結果は省略します。
プログラム1 | プログラム4 |
---|---|
// Pch.h #ifndef __PCH_H__INCLUDED__ #define __PCH_H__INCLUDED__ #include <iostream.h> #endif |
// TestPch2.h #ifndef __TESTPCH2_H__INCLUDED__ #define __TESTPCH2_H__INCLUDED__ bool Birthmonth(); #endif |
プログラム2 | プログラム5 |
// Pch.cpp #include "Pch.h" |
// TestPch2.cpp #include "Pch.h" #include "TestPch2.h" bool Birthmonth() { int a; cout << "あなたは何月生まれですか > "; cin >> a; if(1 <= a && a <= 12) { cout << "へー、" << a << " 月なんですか。" << endl; return true; } else { cout << a << " 月やと!?" << endl << "んな月、あらへんわ!" << endl; return false; } } |
プログラム3 | |
// TestPch1.cpp #include "Pch.h" #include "TestPch2.h" int main() { while(!Birthmonth()); cout << "終了" << endl; return 0; } |
さて、先ずはこれらを普通にビルドしてみて下さい。...何も問題ありませんね。
Pch.h というのがプリコンパイル済みヘッダファイルになる予定です。これだけではまだプリコンパイル済みヘッダファイルにはなっていません。他にも、Pch.h だけをインクルードした Pch.cpp という謎のファイルもあります。
この Pch.h をプリコンパイル済みヘッダファイルにするには、プロジェクトの設定を変更する必要があります。
プロジェクトの設定を変更するには、先ずはメニューから「プロジェクト」→「設定」の順に選択します。面倒な方は Alt+F7 でも構いません。
すると、次のようなダイアログが表示されます。
...いろいろ書き込んでありますね。ここでプロジェクトの設定を変更することができます。
先ずは、プリコンパイル済みヘッダファイルの指定を行います。
左半分では設定の対象を指定するのですが、ここでプロジェクトの名前を選択します。こうすると、プロジェクト全体の設定を行うことになります。
次に、「C++」→「プリコンパイル済みヘッダー」→「プリコンパイル済みヘッダーファイルを使用」と選択していきます。この項目を指定すると、プリコンパイル済みヘッダファイルを使用するようになります。
最後に、プリコンパイル済みヘッダファイルとしてどのヘッダファイルを利用するかを指定します。と、これは厳密には正しくないですね。プリコンパイル済みヘッダファイルを使用する部分を指定するのです。
上のように Pch.h と指定すると、#include "Pch.h" のある行まではプリコンパイル済みヘッダファイルのデータを使用します。このため、#include "Pch.h" より前にはコードは書かないようにします。この行を含む、その行までのコードは一切無視され、この部分にプリコンパイル済みヘッダファイルがインクルードされます。まぁ、コメントならこの行までにあっても別に問題ありませんね。
さて、これでプリコンパイル済みヘッダファイルの指定が終わりました。次は、プリコンパイル済みヘッダファイルの作成です。
今度は、設定の対象を例の Pch.h だけをインクルードしていたファイル、Pch.cpp にします。
そして、「C++」→「プリコンパイル済みヘッダー」→「プリコンパイル済みヘッダーファイルの作成」と選択していきます。この項目を指定すると、この Pch.cpp をコンパイルするときに、一緒にプリコンパイル済みヘッダファイルを作成するようになります。
そして最後にどこまでをプリコンパイル済みヘッダファイルとするかを指定します。
上のように Pch.h と指定すると、#include "Pch.h" のある行までをプリコンパイル済みヘッダファイルとします。Pch.h の内容のみをプリコンパイル済みヘッダファイルとするためには、やはり#include "Pch.h" より前にはコードは書かないようにします。ここも、コメントならこの行までにあっても別に問題ありませんね。
以上のように設定を行い、もう一度コンパイルをしてみて下さい。...と、見た目はあまり変わりませんし、iostream.h 程度ならあまり速度の違いもよく分からないかもしれませんね。
まぁとにかく、以上のようにするとプリコンパイル済みヘッダファイルが利用できるのです。
Windowsプログラムを行うときは windows.h という、それはそれはもうバカでかいヘッダファイルをインクルードします。これを毎回まともにインクルードしていたら時間の無駄です。なので、Windowsプログラミングではプリコンパイル済みヘッダファイルは必須といえるでしょう。別にここで windows.h をインクルードしても全く問題ないので、一度その速度の違いを試してはどうでしょうか?
さて、プロジェクトのファイルの入っているフォルダを開いてみて下さい。そして、Debug というフォルダ(なければそれらしいフォルダ)の中に入って下さい。
そこには、プロジェクトと同じ名前の、pch という拡張子をもったファイルがあると思います。厳密にはこれがプリコンパイル済みヘッダファイルであり、Pch.h はプリコンパイル済みヘッダファイルではありません。ですが、同等であった方が便利なので、上のように同等になるように工夫するのが普通ですね。
そして、わざわざ Pch.cpp というファイルを作らなくても、同じ設定を別のファイルに設定してやっても問題はありません。しかし、そのファイルを変更するとプリコンパイル済みヘッダファイルを作り直そうとします。なので、Pch.cpp という普通は変更しないファイルを作っておくと便利なのです。
もちろん、Pch.h を変更してもプリコンパイル済みヘッダファイルを作り直そうとするので、Pch.h には全く、もしくは滅多に変更しないコードのみを書くようにしましょう。
では、今回の要点です。
次回はまた言語の話に戻ります。それでは。
Last update was done on 2000.8.4
この講座の著作権はロベールが保有しています