24

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

  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:プロンプト

4

4 に答える 4

38

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

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

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

プリコンパイル済みヘッダーを作成するための stdafx.cpp の Visual Studio 設定のスクリーンショットを次に示します。

プリコンパイル済みヘッダーを作成する

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

オプション

これは私の 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
于 2009-10-11T23:43:29.807 に答える
10

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

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

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

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

あなた#include "stdafx.h"は各cppファイルの最初の行でなければなりません。.h ファイルでは使用しないでください。それ以外は、あなたはほぼ正しいです。

于 2009-10-11T23:45:42.770 に答える
5

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

関連するコンポーネントは、プリコンパイル可能なヘッダーをリストする Xh ファイル、Xh のみを含む (コード自体を追加しない) X.cpp ファイル、およびコンパイラ オプションを使用して X.cpp (したがって Xh) をコンパイルすることによって作成される X.pch ファイルです/Yc

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

于 2009-10-12T09:36:41.340 に答える