web-dev-qa-db-ja.com

プロジェクトにプリコンパイル済みヘッダーを実装する方法

プリコンパイル済みヘッダーの目的と理由を理解しています。しかし、それらを実装する際のルールは何ですか?私の理解から、それはこのようなものになります:

  1. YUディレクティブでプリコンパイル済みヘッダーを使用するようにプロジェクトを設定します。
  2. Stdafx.hファイルを作成し、それをプリコンパイル済みヘッダーに設定します。
  3. これを各.hファイルの最上位のincludeステートメントとして含めます。

これは正しいですか?プリコンパイル済みヘッダーに含まれているファイルにそれを含めないでください。現在、これを直感的に使用すると、次のコンパイルエラーが発生します。

エラーC2857:/Ycstdafx.hコマンドラインオプションで指定された '#include'ステートメントがソースファイルに見つかりませんでした

コマンドラインオプションは次のとおりです。

/ Od/I "../External/PlatformSDK/Include"/I ".."/I "../External/atlmfc/Include"/D "_D​​EBUG"/D "_UNICODE"/D "UNICODE"/Gm/EHsc/RTC1/MDd /Yc"stdafx.h "/Fp"....\Output\LudoCore\Debug\LudoCore.pch"/Fo "....\Output\LudoCore\Debug \"/Fd ".. ..\Output\LudoCore\Debug\vc80.pdb "/ W4/WX/nologo/c/ZI/TP/wd4201/errorReport:Prompt

24
Chris

Stdafx.cppはstdafx.hをインクルードし、/Yc"stdafx.h"を使用してビルドする必要があります。

他の* .cppはstdafx.hをインクルードし、/Yu"stdafx.h"を使用してビルドする必要があります。

コンパイラオプションで使用されている二重引用符に注意してください。

これは、プリコンパイル済みヘッダーを作成するためのstdafx.cppのVisual Studio設定のスクリーンショットです。

create precompiled header

以下は、対応するコマンドラインオプションです(これは読み取り専用ですが、他のページで指定された設定を反映しています。IDEは、コンパイラオプションでファイル名の前後に二重引用符を挿入します)。 :

options

これは私のstdafx.cppファイルの内容です。

// stdafx.cpp : source file that includes just the standard includes
// CallWinsock.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"

// TODO: reference any additional headers you need in STDAFX.H
// and not in this file
37
ChrisW

Visual Studioは、プロジェクトだけでなくソースファイルごとに、コンパイル済みのヘッダープロパティを格納できます。

デフォルトでは、すべてのプロパティは「親またはプロジェクトのデフォルトから継承」に設定され、そのプロパティの親オブジェクトの値を表示しますが、子レベル(この場合は.cppファイル)でオーバーライドされると、ファイルは親プロパティからの変更を無視します。

必要な構成は次のとおりです。

  1. 「すべての構成」が選択されたプロジェクトレベルで(プロジェクトプロパティ、構成ドロップダウンをデバッグ/リリースから変更)、プリコンパイル済みヘッダーを「使用」に設定します
  2. ヘッダーのソースとなる.cppファイルを選択します(私の知る限り、どちらでもかまいません)。
  3. 右クリックしてプロパティに移動し、プリコンパイル済みヘッダーに「作成」を選択します
  4. 最後に、他の.cppファイルにプリコンパイル済みヘッダープロパティの値が設定されていないことを確認します(太字でわかります)。
10
Spencer Rose

「stdafx」は単なる慣例です。これは決して必須ではありません。マルチプロジェクトソリューションでは、さまざまなパーツに複数のプリコンパイル済みヘッダーを使用する他のセットアップを使用しました。例えば。 1つのPCHをUIプロジェクトで共有し、別のPCHをデータベースプロジェクトで共有すると便利な場合があります。

関連するコンポーネントは、プリコンパイル可能なヘッダーをリストするXhファイル、Xhのみを含む(そしてコード自体を追加しない)X.cppファイル、およびコンパイラオプション_/Yc_。

Y.cppファイルを_/Yu"X.pch"_でコンパイルすると、コンパイラはおよび破棄から_#include "X.h"_までのすべてを読み取ります。その時点で、入力ストリームを除いて、内部状態をX.pchに格納されている状態に置き換えます(ファイルポインターが_#include "X.h"_の次の行に設定されたまま、Y.cppのままです)。

5
MSalters

きみの #include "stdafx.h"は各cppファイルの最初の行である必要があります。 .hファイルでは使用しないでください。それ以外はあなたの言う通りです。

5
Alan