Visual Studioでは、"stdafx.h"は何に使うのですか?

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

「stdafx.h」は何に使うのですか?このヘッダーファイルを削除しても問題ありませんか?

ソリューション

すべてのC++コンパイラは、1つの深刻なパフォーマンス問題に対処しなければなりません。C++のコードをコンパイルするのは、長くて時間のかかる作業です。

C++ファイルの上に含まれるヘッダをコンパイルするのは、非常に長い時間がかかるプロセスです。Windows APIやその他の大規模なAPIライブラリの一部を構成する巨大なヘッダー構造をコンパイルするのは、非常に非常に長い、遅いプロセスです。すべてのCppソースファイルに対して、何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も。

これはWindowsに限ったことではなく、Windowsのような大きなAPIに対してコンパイルしなければならないすべてのコンパイラが直面する古い問題です。

Microsoftのコンパイラは、プリコンパイルされたヘッダと呼ばれる簡単なトリックで、この問題を改善することができます。このトリックは非常に巧妙です。すべてのCPPファイルは、各Cppファイルの上にインクルードされたヘッダーファイルのチェーンに、潜在的かつ合法的にわずかに異なる意味を与えることができますが(インクルードの前に異なるマクロを#define'dするとか、ヘッダーを異なる順序でインクルードするなど)、ほとんどの場合、そうはなりません。ほとんどの場合、数十から数百のインクルードファイルが存在しますが、それらはすべて、アプリケーションでコンパイルされるすべてのCppファイルに対して同じ意味を持つように意図されています。

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

その方法は、特別なヘッダファイルを、すべてのコンパイルチェーンの開始点として指定することである。

そして、各CPPファイルの先頭に、意味のある内容の前に、#include "stdafx.h"を付けて開始します(前に許されるのはコメントだけです)。

このような状況では、コンパイラはゼロから始めるのではなく、stdafx.hのすべてをコンパイルした結果がすでに保存されている状態からコンパイルを始めます。

このトリックは、マイクロソフトのコンパイラに特有のものではなく、独自に開発されたものでもないと思います。

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

Visual Studio 2010では、CPPプロジェクトを右クリックして、[プロパティ]を選択し、[構成プロパティ]の[プリコンパイルされたヘッダー]を選択することで、GUIからこの設定を制御することができます。他のバージョンのVisual Studioでは、GUIの場所が異なります。

なお、プリコンパイル・ヘッダを無効にしても(あるいはプリコンパイル・ヘッダをサポートしていないツールでプロジェクトを実行しても)、プログラムが違法になるわけではなく、ツールが毎回すべてをゼロからコンパイルすることになるだけです。

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

解説 (16)

stdafx.hに含まれるヘッダは、その後のコンパイル時に時間を節約するためにあらかじめ処理されます。詳しくはMSDNのこちらをご覧ください。

クロスプラットフォームのアプリケーションを構築している場合、プロジェクト作成時に "Empty project" をチェックすると、Visual Studioはプロジェクト内にファイルを一切置かなくなります。

解説 (2)

私はちょうど自分自身がベアボーンフレームワークを作成しようとしているので、これに遭遇しましたが、Visual Studio 2017で新しいWin32 Programオプションを作成することから始めました。 "stdafx.h"は不要なので削除してください。 そして、Solution Explorerにある愚かな"stdafx.h"と"stdafx.cpp"を、プロジェクトからファイルを削除します。 その代わりに、次のようにしてください。

#include 

代わりに

解説 (0)