2017-02-10 18 views
-3

プリコンパイルされたヘッダーの目的は、すでにコンパイルされたオブジェクトファイルを実際のプロジェクトにリンクすることによって、コンパイルプロセスを高速化しようとしていることです。しかし、私は理解していないことVisual StudioでVisual Studioにstdafx.hを明示的に適用する必要があるのはなぜですか(Project Properities - > C/C++ - > Precompiled Headers - > Precompiled Header)? #include "stdafx.h"で十分ではないのはなぜですか?stdafx.hをVisualStudioに含めることができないのはなぜですか?

+2

PCHを作成するかどうかIDEに指示する必要があります。 –

+0

盲目的に投票票を下げないでください。何が改善されるべきかのヒントを提供してください。ありがとう –

答えて

2

いわゆるstdafx.hは、通常のヘッダーファイルと見なされます。名前には特別なものは何もありません。プリコンパイル済みヘッダーを自動的に有効にすることは想定されていません。

stdafx.hは、他のコンパイラでは通常のヘッダーファイルと見なされますが、MSVCでプリコンパイラヘッダーを使用しない場合は考えられます。

それはあるあなた、あなたが実際には、プリコンパイル済みヘッダーを有効にするMSVCコンパイラに伝えることになっている。それはまさにあなたがそのプロジェクト設定を持っている理由です。そして、プリコンパイルされたヘッダを有効にした場合にのみ、stdafx.hは特別な役割を果たし、コンパイラから特別な扱いを受けます。そして、それは必ずしもstdafx.hではありません。プロジェクト設定で別の名前を指定することによって、この特殊な役割を他のヘッダーに割り当てることができます。

実際には、Microsoft固有のライブラリやフレームワークとは関係のないプロジェクトでAFXへの参照を参照するのは非常に奇妙です。

+0

正確な特別扱いが 'stdafx.h'をコンパイラから受け取るのはもっと具体的なものでしょうか?古典的なコンパイルリンクプロセスとはどのように違いますか? –

+1

@Wakan Tanka:ヘッダーのプリコンパイルは "リンク"とは関係ありません。それはまったく別のプロセスです。 'stdafx.h 'が受け取る"特別扱い "は、基本的にその内容が*プリコンパイル*され、プリコンパイルされた形式で使用されます。それがすべてです。 – AnT

+0

"MSVCコンパイラに実際にプリコンパイル済みヘッダーを有効にしたいと言っているのはあなたです。" '#include" stdafx.h "'を実行したときにMSVCに伝えていませんか? –

3

なぜ、#include "stdafx.h" [...]で十分ですか?

これは単なる標準のC++プリプロセッサディレクティブなので、 *コンパイラに関しては、#include <string>と変わりありません。追加のセマンティクスをアタッチする必要がある場合は、コンパイラにそのことを伝える必要があります。

Visual Studioがプリコンパイル済みヘッダーを実装する方法が混乱しているように見えるので、ここにはドキュメントへのリンクがあります。Creating Precompiled Header Files


*マインドあなたは、それがPCHを生成するために使用されるデフォルトのヘッダーの名前であること以外の名前"stdafx.h"について何も特別なことは、ありません。

+0

私のVisual Studioプロジェクトでは、PCHヘッダーは 'stdafx.h 'という名前でもありません。私はPCHヘッダーの名前を指定するCMakeでマクロを使用しますが、 – drescherjm

+0

申し訳ありませんが、私は従いません。追加の意味は何ですか?コンパイラは単に '#include" stdafx.h "を" stdafx.h "の内容で置き換えます。この時点から、 'stdafx.h 'で宣言された関数を呼び出すことができ、コンパイラは文句を言うことはありません。コンパイル後、 'stdafx.obj'ファイルは私のプロジェクトにリンクされています。ここに明示的に何かを指定する必要はありません。 –

+0

@WakanTanka:**標準**セマンティクスについて説明しました。追加のセマンティクスは、コンパイラが '#include'指示文を**前処理された**と**プリコンパイルされた**バージョンのヘッダで置き換えることです。また、ヘッダファイルはコンパイル単位ではありません。 * "stdafx.obj" *ファイルはありません(PCHの場合は* stdafx.cpp *ファイルも用意していない限り)。 .objファイルはPCHとは関係ありません。 – IInspectable

-1

プリコンパイル済みヘッダーを安全に使用できるかどうかは、簡単には解答できません。あなたのヘッダーがあるとします。

#ifndef FOO 
void foo(); 
#endif 

ここで、このヘッダーをプリコンパイルするとします。

別のソースファイルでは、ヘッダーを含める前にFOOを定義することを止めるものはありません。その場合、コンパイルされたヘッダーは使用しないでください。コンパイラーが知ることができる唯一の方法は、ヘッダーのどこでも使用されている各マクロをすべて追跡する場合です。

これは多くの作業です。 GCCはこれを行いますが、Microsoftはそうしないことを選択しました。

プリコンパイルされたヘッダーは、いくつかの特定のシナリオでのみ使用できると言っても過言ではありません。大きなユースケースは、これらのいくつかの特定のシナリオでカバーされていれば十分です。

関連する問題