2011-08-26 1 views
11

stdafx.hを使用する方法は、依存関係を分離する点で何ですか?stdafx.hの使い方は?

私は、そこにすべてを入れ、その後、私のコンパイルが速く燃えるされている、と私は任意のファイルに言う必要があるすべての警告と

#include "stdafx.h" 

である場合:

  1. ノーどのファイルがどのヘッダーに依存しているかが分かります。
  2. モジュール性が低下し、コードを再利用できなくなります。
  3. 多くの苦痛を伴うことなく、CをC++のもの(例えば、cstringstring.h)から分離することはできません。 (言えばうち、これでもかまいん?)

私はそこには何もを入れていない場合は、私はよく、すべてを整理することができます - しかし、その後、私のコンパイルが劇的に遅くなります。

私はそこにすべてを入れてもなら、私は今、私は同期の問題を追跡する必要が注意すべき点で、両方の長所を取得し、私の個々のファイル内のすべてのヘッダーを含めます。

この問題の解決策はよく知られていますか?

答えて

13

コードが変更される可能性があり、プログラム全体が再コンパイルされるため、独自のヘッダーファイルをstdafx.hに配置しないでください。

私は通常、すべてのブーストインクルードなどの標準ヘッダーやその他のライブラリをそこに置きます。

+0

合意。プリコンパイルされたヘッダーには、そのプロジェクトの範囲内で触れることのないものを入れます。 –

+0

これはどのように関係があるのか​​分かりません。私はまだ、私のソースファイルのどれがどのヘッダに依存しているのかわかりません(実際には#include を間接的にすべてのファイルに含める必要がありますか?)それで、まだモジュール化されていないでしょう。 – Mehrdad

+3

@Mehrdad、それはプリコンパイルされたヘッダーを持つ妥協点の1つです。 – Marlon

4

プリコンパイル済みヘッダーを使用する場合は、PCHが存在しなくてもプロジェクトがきちんとコンパイルされるようにする必要があります(すべてのTUのインクルードを置換するのではなく最適化として扱います)。それ以外には、絶対にすべてを入れないでください(もっと重要なのは、自分のプロジェクトからヘッダーを付けないでください.PCHには、システムライブラリ、外部依存関係など、まったく変わったり変わったりしないものだけが含まれていなければなりません)。むしろ使用済み/最大のものをプリコンパイルしたままにしておきます。

1

個人的には、依存性がどのようになっているかわかりません(ビジビリティ)よりもむしろコンパイルが遅くなります。しかし、すべてには限界があります。

各プロジェクトには独自のプリコンパイル済みヘッダーファイルがあるので、ここにcommon-to-all-includesを入れるだけです。プロジェクト全体で使用され、それらを変更していないので、プロジェクトがいくつかのブーストヘッダを使用しているとします。したがって、システムやサードパーティのものなど、あらかじめコンパイルされたヘッダーには、めったに/決して変更しないヘッダーを入れてください。

コンパイルのスピードについては、できるだけ前方宣言し、小さなライブラリに分割し、揮発性コードが他の多くのコンパイルに影響を与えないような方法で整理できるかどうかを調べるコード。

1

Yorコンパイラには、 "show includes"フラグが含まれている可能性があります。これをオンにして、深くネストされたインクルード階層を繰り返し検索します。このような深いツリーごとに、ヘッダーに最も浅いインクルードファイルを含めることを検討してください。

0

条件付きでPCHを組み込み、 "#define _PRE_COMPILE_"のように定義してください このようにして、元のヘッダーは引き続き表示され、必要に応じてコードがモジュール化されます。これの例は、含まれることになります

#ifdef _PRE_COMPILE_ 
#include "stdafx.h" 
#elif 
#include <iostream> 
#include <cstring> 
#endif 

すべてのソースファイルの先頭にこれを含めます。

+0

を含むPCHを必要としました。これは、MicrosoftのPCH実装の仕組みのために、' #include "stdafx.hが' #include "stdafx.h"の前に '' ifdef' –