15

stdafx.h というヘッダー ファイルがあり、これはもちろんプリコンパイルされています。これらのファイルを .cpp ファイルに含める必要があることを読みましたが、これらのステートメントの一部は、それに付随するヘッダー ファイルで既に必要です。

stdafx をヘッダーまたは cpp に追加する必要がありますか? ヘッダーに入れるのが良いと思ったのですが、代わりにヘッダーに入れる義務があるようです。

例:

stdafx には freeglut が含まれています。
私のクラス ヘッダー ファイルには GLenum の属性があります。

クラスの .h に stdafx を含める必要がありますか?

4

2 に答える 2

28

stdafx.hは、プロジェクトのすべての cpp ファイルに最初に含める必要があります。


C++ はヘッダー ファイルをコンパイルせず、Cpp ファイルのみをコンパイルする ことを考慮してください。

したがって、stdafx が cpp ファイルの最初のインクルードである場合、コンパイラは、Cpp ファイルのヘッダー ファイルにヒットしたときに、ヘッダー ファイルが必要とするすべてのものを取得します。

例えば

A.cpp があり、ああ、
std:string が必要です。

B.cpp & Bh
Bh には Ah が必要なので、Bh にも std::string が必要です。

これは良い習慣なので#include <string>、stdafx.h に入れます。

何も std::string を認識できないため、ビルドは失敗します

A.cpp と B.cpp の最初のインクルードとして stafx.h を配置します。
コンパイラが A.cpp にヒットすると、インクルード for を取得し<string>、次に Ah を取得します。 std::string が何であるかを知っているので、すべてが満足です。

コンパイラは B.cpp にヒットし、最初に stdafx をインクルードします。これにより がもたらされ<string>、次に Bh にヒットし、Ah がもたらされます。これは、std::string が既にインクルードされているためです。

お役に立てれば。

于 2011-03-08T15:15:40.400 に答える
6
  • そこにあるはずのものだけをプリコンパイル済みヘッダーに含めます
  • プリコンパイル済みヘッダー ファイルは、すべての .cpp の最初のインクルードでなければなりません
  • 前方宣言を優先して、別のヘッダーに含めることは避けます

stdafx.h に何かを含める前に、次の 2 つの質問を自問してください。

  1. このヘッダーは私が変更することはありませんか?
  2. すべての複数ソース ファイルにこれを含める必要がありますか?

いずれかに対する答えが「いいえ」の場合は、含めないでください。

于 2011-03-08T15:27:14.953 に答える