1. ホーム
  2. visual-studio

[解決済み] Visual Studioで "stdafx.h "は何に使うのですか?

2022-03-19 19:18:05

質問

という名前のファイルは stdafx.h は、Visual Studio 2010でプロジェクトを開始すると、自動的に生成されます。クロスプラットフォームのC++ライブラリを作成する必要があるので、このヘッダーファイルは使用しない/できない。

とは stdafx.h は何に使うのですか?このヘッダーファイルは削除してもいいのでしょうか?

どのように解決するのですか?

すべてのC++コンパイラは、1つの深刻なパフォーマンス問題を抱えています。C++コードのコンパイルは、長く、遅いプロセスです。

C++ファイルの上に含まれるヘッダをコンパイルすることは 非常に 長く、遅いプロセスです。Windows APIやその他の大規模なAPIライブラリの一部を形成する巨大なヘッダ構造をコンパイルするのは 非常に , 非常に 長く、遅いプロセスです。Cppのソースファイル1つ1つに何度も何度も同じことをしなければならないのは、死活問題です。

これはWindowsに限ったことではなく、Windowsのような大規模なAPIに対してコンパイルする必要があるすべてのコンパイラが直面する古くからの問題です。

マイクロソフトのコンパイラは、この問題を改善するために プリコンパイルヘッダー . このトリックはかなり巧妙です。すべてのCPPファイルは、各Cppファイルの上に含まれるヘッダーファイルの連鎖に、潜在的かつ合法的にわずかながら異なる意味を与えることができますが(異なるマクロをあらかじめ#defineしておくとか、ヘッダーを異なる順序で含めるとか)、ほとんどの場合そうなることはないでしょう。ほとんどの場合、数十から数百のインクルードファイルがありますが、それらはすべて、アプリケーションでコンパイルされるすべてのCppファイルに対して同じ意味を持つように意図されています。

コンパイラは、すべてのCppファイルとその数十個のインクルードを毎回文字通りゼロからコンパイルし始める必要がなければ、時間を大幅に節約することができます。

このトリックは、すべてのコンパイルチェーンの出発点として、特別なヘッダーファイルを指定することから始まります。 stdafx.h 単に歴史的な理由によるものです。

stdafx.h ファイルに、API のための巨大なヘッダを適切な順番ですべてリストアップし、CPP ファイルの一番上にある #include "stdafx.h" 意味のある内容の前に(唯一許されるのはコメントだけです)。

このような条件下では ゼロから にあるものをすべてコンパイルして保存した結果からコンパイルを開始します。 stdafx.h .

この仕掛けは、マイクロソフトのコンパイラに特有のものでも、独自に開発したものでもないと思うのです。

マイクロソフト社のコンパイラの場合、プリコンパイルされたヘッダーの使用を制御する設定は、コンパイラへのコマンドライン引数で制御されます。 /Yu "stdafx.h" . ご想像の通り stdafx.h ファイル名は単なる慣習であり、必要であれば変更することができます。

Visual Studio 2010では、この設定はGUIからCPPプロジェクトを右クリックして「Properties」を選択し、「Configuration Properties C/C++Precompiled Headers」に移動することで制御できます。Visual Studioの他のバージョンでは、GUIの位置は異なります。

プリコンパイルヘッダを無効にしても(あるいはプリコンパイルヘッダをサポートしないツールでプロジェクトを実行しても)、プログラムが不正になるわけではありません。

Windowsに依存しないライブラリを作成する場合は、簡単にコメントアウトまたは #include から stdafx.h ファイルを作成します。このファイル自体を削除する必要はありませんが、明らかに上記のプリコンパイルヘッダーの設定を無効にすることで、同様に削除することができます。