web-dev-qa-db-ja.com

Visual Studio C ++で「StdAfx.h」を必要としないファイルでも、「StdAfx.h」を含める必要があるのはなぜですか。

プリコンパイル済みヘッダーが「#include "StdAfx.h"で何をしているのかを理解しています。もちろん、それらをオフにできることはわかっていますが、それは私の質問ではありません。

プリコンパイル済みヘッダーを使用している場合、Visual C++では、StdAfx.hのヘッダーを使用していないファイルであっても、#include "StdAfx.h"にevery cppファイルが必要です。 1つのファイルにStdAfx.hを含めるのを忘れた場合、それはエラーです。しかし、なぜ?明らかなアプローチは、「StdAfx.hをインクルードすると、そのファイルはそれを使用しますが、インクルードするのを忘れると、それらのヘッダーファイルは単にインクルードされない」というものです。 VC++で必要のないときにStdAfx.hを含める必要がある理由がわかりません。通常のヘッダーファイルのように扱う方が簡単だったようです。

これが必要な理由はありますか?

8
user2543623

マークスの答えへの単なる追加。実際、すべてのプロジェクトソースファイルに手動でstdafx.hを含める必要はありません。プロジェクトオプションForced Include Filesを使用できます: enter image description here

そうすれば、stdafx.hがすべてのソースに自動的に含まれます。

10
Ari0nhh

プロジェクトのデフォルトは「プリコンパイル済みヘッダーを使用する」です。必要に応じて、個々のファイルを「プリコンパイル済みヘッダーを使用しない」ように設定できます。

実際には、 stdafx.cpp自体には、プロジェクトのデフォルトとは異なるオプションがあります。

enter image description here

この構成が言っているのは、「このファイル(stdafx.cpp)のコンパイルを開始し、stdafx.hを含むステートメントのコンパイルが終了したら停止し」、コンパイル済みの情報を.pchファイルとして保存することです。このファイルを最初に使用できるようにします。

プロジェクトのデフォルトは次のとおりです。

enter image description here

この構成が言っていることは、「コンパイルされたファイルごとに、指定された.pchのプリコンパイルされたデータから開始し、新しい情報のコンパイルを開始しますafterポイントstdafx.hが含まれています。」これは重要であり、stdafx.hをファイルの最初の行として含める必要がある理由です。後でファイルに入れても機能しますが、そのデータは.pchにないため、#includeより前のものはすべて無視されます。 #includeがないということは、VSがファイル全体をスキャンして、コンパイル済みの開始位置を探し、それを見つけられないことを意味します...エラーを生成します。

コンパイル済みの情報を使用したくないファイルがある場合は、ファイルを選択してオーバーライドできます。例:

enter image description here

Visual Studioは、プリコンパイル済み情報を使用せず、含めるヘッダーを検索しません。

9
Mark Tolonen

ファイルを選択したら、プロパティを右クリックして[C/C++ \プリコンパイル済みヘッダー]セクションに移動し、[プリコンパイル済みヘッダー]を[プリコンパイル済みヘッダーを使用しない]に設定します。構成(左上)が現在選択されているビルド。

「アクティブな」構成が常に自動的に選択されるとは限りません。したがって、非アクティブな構成のオプションを設定している可能性があるため、エラーが引き続き発生します;)

0
Den-Jason