web-dev-qa-db-ja.com

プリコンパイル済みヘッダー

Visual C++ 6にあるサンプルプロジェクト(私のものではありません)があります。これをVisual Studio2008に変換しようとしています。

古いプロジェクトはプリコンパイル済みヘッダーを使用しています。今の質問は次のとおりです。

  1. プリコンパイル済みヘッダーとは何ですか?

  2. 古いプロジェクトはプリコンパイル済みヘッダーを使用しているためです。 Visual Studio 2008(新しいプロジェクト)でも使用します。しかし、"stdafx.hを含めるのを忘れましたか"というエラーが表示されます。問題を解決するために、すべてのソースファイルに "stdafx.h"を含めます。それは完璧に機能しました。しかし、古いプロジェクトでは、すべてのファイルに「stdafx.h」が含まれていませんでしたか?次に、各ソースファイルに「stdafx.h」を含めることをオプトアウトするにはどうすればよいですか。すべてのソースファイルが「stdafx.h」で定義されたインクルードファイルを必要とするわけではないため、必要なのはごくわずかです。それはどのように行われますか?

編集:プリコンパイル済みヘッダーの使用から一部のファイルを除外するにはどうすればよいですか?

31
akif

プリコンパイル済みヘッダーとは何ですか?

多くの場合、C++ソースファイルには外部ライブラリからのヘッダーが含まれています。 Windowsでは、windows.hを含めます。これらのヘッダーファイルは非常に大きくなる可能性があり、処理に時間がかかります。 C++ファイルをコンパイルするたびに、コンパイラはこれらのヘッダーファイルから数千行を読み取って処理する必要があります。ただし、外部ライブラリは変更されないため、これらのファイルを1回だけ処理して結果を保存すると、時間を大幅に節約できます。

プリコンパイル済みヘッダーは、中間形式に処理されたヘッダーファイルの集まりであり、後でコンパイラーが何度も使用できます。

Visual C++のプリコンパイル済みヘッダー

Visual C++では、#include内の変更されていないすべてのヘッダーファイルをstdafx.hするのが通例です。次に、stdafx.pchを含むだけのstdafx.cppをコンパイルするときに、プリコンパイル済みヘッダーstdafx.hを作成するようコンパイラーに指示します。プリコンパイル済みヘッダーを別の.cppファイルで使用する場合は、最初のインクルードファイルとしてstdafx.hをインクルードし、プリコンパイル済みヘッダーにstdafx.pchを使用するようコンパイラーに指示する必要があります。

stdafx.hを含めないことについてエラーが発生した場合は、その特定のソースファイルにプリコンパイル済みヘッダーを使用しないようにコンパイラーに指示するだけです。 (または、stdafx.hを含めることができます。)

個々のソースファイルのプリコンパイル済みヘッダー設定

Visual C++を使用すると、プロジェクト全体および個々のファイルのコンパイラ設定を制御できます。個々のプロパティにアクセスするには、ソリューションエクスプローラーでソースファイルを選択し、それを右クリックして、コンテキストメニューからプロパティを選択します。プリコンパイル済みヘッダーのオプションは、構成プロパティ=>C/C++にあります。 )=>プリコンパイル済みヘッダー。これらの設定を変更する場合は、すべての構成に対して変更する必要があります(たとえば、DebugおよびRelease)。

プリコンパイル済みヘッダーを使用している場合は、プロジェクト全体に対して、プリコンパイル済みヘッダーにstdafx.pchを使用するようにコンパイラーに指示する設定があります。 stdafx.cppには、コンパイラにstdafx.pchを生成するように指示する個別の設定があり、stdafx.hを含まないソースファイルがある場合は、これらに個別の設定を設定して使用しないようにすることができます。プリコンパイル済みヘッダー。

55

コードをコンパイルするとき、コンパイラーはすべての#includedヘッダーを調べて、.cppファイル内のコードをコンパイルする方法を知る必要があります。

大規模なプロジェクト(またはMFCなどのライブラリを使用するプロジェクト)では、これらのヘッダーが巨大になる可能性があるため、コンパイルに長い時間がかかります。

これらのヘッダーのほとんどは(あるとしても)それほど頻繁には変更されないため、コンパイラーに「プリコンパイル」させることができます。つまり、ヘッダーを処理し、その状態をプリコンパイル済みヘッダーに保存します。次回コンパイルするときは、これらすべてのヘッダーを再度読み取ってコンパイルする必要がないため、はるかに高速です。

Visual Studioの要件の1つは、プリコンパイル済みヘッダーを使用する場合、プロジェクト内のすべてのファイルにヘッダーを含める必要があることです。

プロジェクトが小さい場合、または頻繁にビルドしない場合は、「プリコンパイル済みヘッダー」オプションを無効にすることができます(プロジェクト設定で。これは全体プロジェクトに適用されます)。あなたが得る唯一の効果はそれがより遅くコンパイルするかもしれないということです。または、オプションを有効のままにして、すべてのファイルの最初のインクルードとして#include "stdafx.h"を追加します。

4
Jason Williams
  1. [〜#〜] msdn [〜#〜] を参照してください
  2. 通常。すべてのcppファイルに「stdafx.h」を含める必要があります。重要なのは、それらがプリコンパイルされていることであり、それらのすべてが特定のファイルで使用されているわけではないことを心配する必要はありません。
0
bocco