5

コンパイラがソース(eg)ファイルをコンパイル*.cppすると、オブジェクトファイル(eg *.o)が作成されるため、後で他のファイル(Windowsの場合はファイル)にリンクされ.o.so実行.lib可能ファイルが構成されます。

ここで、いくつかの.pchファイルを作成するたびにヘッダーファイルをコンパイルしないという類推的な状況で、リンカーによってリンクされます。

ここで、Visula Studioプロジェクトのスコープ内でプリコンパイル済みヘッダーが定義されている場合、Visual Studio**fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?**がヘッダーファイルが.cppファイルに含まれていないというエラー(例)で文句を言うのはなぜですか。

要約すると、ここに私の質問があります:

  1. 各.cppファイルにプロジェクトのプリコンパイル済みヘッダーが必要なのはなぜですか?
  2. 各コンパイルユニットにプリコンパイル済みヘッダーが存在するという要件は、コンパイルプロセスをどのように最適化しますか?言い換えれば、この要件の利点は何ですか?(どこに含めるか、どこに含めないかはユーザー次第です!)
  3. プリコンパイル済みヘッダーが.pchファイルの2%のみを使用する.cppファイルに含まれている場合、残りの98%は対応する.oファイルに追加されますか?
4

3 に答える 3

11

各.cppファイルにプロジェクトのプリコンパイル済みヘッダーが必要なのはなぜですか?

あなたがそれを求めたからです。使用したくない場合は、.cppファイルのオプションを変更する必要があります。それを右クリックし、プロパティ、C / C ++、プリコンパイル済みヘッダー、 "Create / Use"="プリコンパイル済みヘッダーを使用していません"。デフォルト設定は「使用」です。これを行うことにはほとんど意味がありません。

各コンパイルユニットのプリコンパイル済みヘッダーは、コンパイルプロセスをどのように最適化しますか?

#includesを解析する必要がないことによって。あなたがするときに特に便利です#include <windows.h>。数百の.cppファイルを含む大規模なプロジェクトでは、合計で数分になるため、節約される時間は秒単位です。これは、生成されたコードの品質を損なうことなくコンパイラを高速化するための最も安価な方法です。

次に、残りの98%が対応する.oファイルに追加されますか?

もちろん違います。

于 2012-09-19T10:14:38.413 に答える
4
  1. 実際には、すべてのコンパイルユニットにプリコンパイル済みヘッダーを含める必要はありません。単一のファイルの「プリコンパイル済みヘッダーを使用しない」設定は、そのファイルのC / C++->プリコンパイル済みヘッダーのプロパティセクションで設定できます。しかし、これは大変な作業であり、本番コードでそれを行う人を私は知りませんでした。
  2. 最適化では、プリコンパイル済みヘッダーが1回だけ作成され、シバン全体が再コンパイル/再インクルード(一種)せずにすべてのコンパイルユニットで再利用されます。何度も含まれるファイルのセットがある場合、これによりコンパイル時間を大幅に節約できます。プリコンパイル済みヘッダーの手入れとフィードも参照してください。
  3. いいえ、静的リンクの場合と同じように、余分なファイルの内容を取得することはありません。
于 2012-09-19T10:12:10.033 に答える
2
  1. あなたの質問は、「このヘッダーが必須であるのに、なぜコンパイラーはこのヘッダーが常にそこにあると想定できないのか」という意味だと思います。その理由は、VSが標準からそれほど逸脱したくないからです。.cppファイルがヘッダーファイルの何かを使用している場合は、それをインクルードする必要があります。このようにして、プリコンパイル済みヘッダーをオフにしても、ファイルはまったく同じようにコンパイルされます(時間がかかるだけです)。
  2. 他の人が言っているように、必要に応じて、個々のファイルのプリコンパイル済みヘッダーを明示的に無効にすることができます。すべてではないにしても、ほとんどのファイルで使用している要素のみをプリコンパイル済みヘッダーに含める必要があるという考え方です。
  3. いいえ、プリコンパイルされているヘッダーに関係なく、結果のオブジェクトコードは同じである必要があります。
于 2012-09-19T10:22:52.900 に答える