column

stdafx.h

stdafxの使用方法?

stdafx.h stdafx.cpp

 VCにおいてソースコードを自動生成するとstdafx.hというヘッダーファイルがインクルードされます。
 このstdafx.hはMSDNでは標準のシステム インクルード ファイルおよび頻繁に使用されるがほとんど変更されないプロジェクト固有のインクルード ファイル用のインクルード ファイル と説明していますが、これがどんな所でどの様に必要になってくるのかということはコンパイルの流れを目で見えるわけではないのですぐにわかるという人はいないとおもいます。

 自分自身も同様でこのヘッダーファイルがどういった動作をするのかということはよくというところまではわからいのですが、調べてみたり実際にプログラムを作っているなかで警告として弾かれる箇所を見ていると、どうやら、プリコンパイル済みヘッダーは名前のとおり最初からコンパイルされているヘッダーといわけではなく、複数のcppなどのソースコードファイルで一環として使用されるヘッダーファイルであるWindows.htchar.hなどのヘッダーファイルをまとめてstdafx.hとしてビルド時にコンパイルしておき、それを複数のソースコードファイルから共通して使用するようにするためのヘッダーファイルなんだとおもいます。

 調べていく中で、stdafx.hを削除したい─という質問のページを目にしましたが、自分がこの質問に対して答えを言うとしたら削除しないほうがいいとおもいます。
これはコンパイル時にかかる時間や、ファイルサイズの肥大を考えた場合を考えるといえることで、もしもプリコンパイル済みヘッダーを使用しなかった場合各ソースコードごとにそのソースコードで必要なヘッダーファイルのインクルードさせる必要があります。
 例を示すと、main.cppWindows.hをインクルードし、sub.cppでも同じようにwindows.hをインクルードさせたとして、 その二つのソースコードはそれぞれコンパイルされる。その間にwindows.hはそれぞれのソースコードに対しインクルードされるので、計2回インクルードされることになるので、若干ですがプログラムファイルのサイズが肥大してしまう。

 ただし、これはソースコードをソリューションに追加した場合(リンク)においてのことで、Main.cpp内でsub.cppをインクルードさせた場合はsub.cppstdafx.hのインクルードは 行う必要がありません。
 もしも、main.cpp内でsub.cppをインクルードしている場合において、stdafx.hでデフォルトでインクルードされていないcommctrl.hなどのヘッダファイルをインクルードさせたい場合は、両方のソースコードで使用していたとしてもsub.cpp内とmain.cpp内両方でインクルードしても構いません。
 これは、commctrl.h内では2重インクルードを防止するためのコードが書かれているからです。commctrl.hも含めあらかじめWindowsプラットフォームSDKで用意されているヘッダファイルなどにはそういったインクルードガードのコードが書かれていますので、特に気にすることはありません。
 他のさまざまなSDKにおいても同様にインクルードガードのコードが書かれているものが殆どです。

 最後に、stdafx.hには// TODO: プログラムに必要な追加ヘッダーをここで参照してください。というように書かれていますが、ここには本来プロジェクト全体で使われるヘッダーファイルを 書いておけばいいのですが、私自身はここではcommctrl.hなどのヘッダーファイルをインクルードせずに独自に作ったインクルード目的でのソースコードでそのソースコードに必要なヘッダーファイルを インクルードさせています。
 これは、将来そのソースコードを公開することを仮定してVC以外の開発環境でもインクルードするだけで動作するように互換性を持たせるためです。ただし、同じようにcommctrl.hをつかったsub.cppを別途でコンパイルする必要がある場合は、 stdafx.hでインクルードするようにしています。