stdafx.h
Visual Studio 2010でプロジェクトを開始すると、という名前のファイルが自動的に生成されます。クロスプラットフォームのC ++ライブラリを作成する必要があるため、このヘッダーファイルを使用できない/使用できません。
何にstdafx.h
使用されますか?このヘッダーファイルを削除してもよろしいですか?
stdafx.h
Visual Studio 2010でプロジェクトを開始すると、という名前のファイルが自動的に生成されます。クロスプラットフォームのC ++ライブラリを作成する必要があるため、このヘッダーファイルを使用できない/使用できません。
何にstdafx.h
使用されますか?このヘッダーファイルを削除してもよろしいですか?
回答:
すべてのC ++コンパイラには、対処する必要のある深刻なパフォーマンスの問題が1つあります。C ++コードのコンパイルは、長くて遅いプロセスです。
C ++ファイルの上に含まれているヘッダーのコンパイルは、非常に長く、遅いプロセスです。Windows APIおよびその他の大きなAPIライブラリの一部を形成する巨大なヘッダー構造をコンパイルすることは、非常に、非常に長く、遅いプロセスです。すべてのCppソースファイルに対して何度も何度も何度も何度も何度も何度も何度も繰り返す必要があるのは、致命的なことです。
これはWindowsに固有のものではありませんが、Windowsのような大きなAPIに対してコンパイルする必要があるすべてのコンパイラが直面する古い問題です。
Microsoftコンパイラは、プリコンパイル済みヘッダーと呼ばれる簡単なトリックでこの問題を改善できます。トリックは非常に巧妙です:すべてのCPPファイルは、各Cppファイルの上部に含まれるヘッダーファイルのチェーンに潜在的かつ合法的に異なる意味を与える可能性があります(インクルードに先立って異なるマクロを#define'dするなど)ヘッダーを異なる順序で含めることにより)、ほとんどの場合そうではありません。ほとんどの場合、数十または数百のインクルードファイルがありますが、それらはすべて、アプリケーションでコンパイルされるすべてのCppファイルに対して同じ意味を持つことを目的としています。
コンパイラは、すべてのCppファイルとその数十のインクルードのコンパイルを文字通り毎回最初からコンパイルする必要がない場合、時間を大幅に節約できます。
トリックは、すべてのコンパイルチェーンの出発点として、特別なヘッダーファイルを指定からなり、一般的にファイル命名されるいわゆる「プリコンパイルヘッダ」ファイル、STDAFX.H歴史的な理由のために、単純。
stdafx.hファイルにAPIのすべての大きな巨大なヘッダーを適切な順序でリストし、#include "stdafx.h"
意味のあるコンテンツの前に、各CPPファイルの先頭をで始めます(これまで許可されている唯一のことは、コメント)。
これらの条件下では、コンパイラーは最初からではなく、ですべてをコンパイルした結果が既に保存されているものからコンパイルを開始しstdafx.h
ます。
このトリックがMicrosoftコンパイラに固有のものであるとは思わない。また、これがオリジナルの開発であったとは思わない。
Microsoftコンパイラーの場合、プリコンパイル済みヘッダーの使用を制御する設定は、コンパイラーへのコマンドライン引数によって制御されます/Yu "stdafx.h"
。ご想像のとおり、stdafx.h
ファイル名の使用は単なる規則です。必要に応じて名前を変更できます。
Visual Studio 2010では、この設定はGUIからCPPプロジェクトを右クリックして[プロパティ]を選択し、[構成プロパティ\ C / C ++ \プリコンパイル済みヘッダー]に移動して制御されます。Visual Studioの他のバージョンでは、GUI内の場所が異なります。
プリコンパイル済みヘッダーを無効にした場合(またはそれらをサポートしていないツールを使用してプロジェクトを実行した場合)、プログラムが不正になることはありません。これは単に、ツールが毎回すべてを最初からコンパイルすることを意味します。
Windowsに依存しないライブラリを作成する場合は、簡単にコメント化したり#include
、stdafx.h
ファイルからを削除したりできます。ファイル自体を削除する必要はありませんが、上記のプリコンパイルヘッダー設定を無効にすることで、ファイルを削除することもできます。
#include "stdafx.h"
ですか?もちろん、それは単なる標準の#includeです。「MS拡張機能」の部分は、コンパイラのパフォーマンス最適化にすぎません。たまたま "stdafx.h"と呼ばれるヘッダーファイルを持つセマンティクスは変更されません。インクルードを削除し、コードがstdafx.hを介してインクルードされたものに依存している場合は、直接インクルードする必要があることに注意してください。
#include
、ソースファイル内の場所に単純かつ文字どおり「貼り付け」られます(マクロを評価するのと同じ「プリプロセッサー」ステップで行われます)。結果の合計ファイルは、実際のコンパイラに渡されます。コンパイラは、ヘッダーファイルを別のエンティティとして認識しません。ヘッダーファイルに宣言を置くのは、ヘッダーファイルでうまく機能するためです。これは従来の規則です。それを試してみてください!プログラム全体でヘッダーファイルを作成し、#includeのみを含むソースファイルを作成します。正常にコンパイルされます。
これは「プリコンパイル済みヘッダーファイル」です。stdafx.hに含めるすべてのヘッダーは、後続のコンパイル中の時間を節約するために前処理されます。詳細については、MSDNを参照してください。
クロスプラットフォームアプリケーションを構築している場合は、プロジェクトの作成時に「プロジェクトを空にする」をオンにすると、Visual Studioはプロジェクトにファイルを一切配置しません。
"Stdafx.h"はプリコンパイル済みヘッダーです。標準のシステムインクルードファイルおよび頻繁に使用されるが変更頻度の低いプロジェクト固有のインクルードファイル用のインクルードファイルです。これにより、コンパイル時間と不要な処理が削減されます。
プリコンパイル済みヘッダーstdafx.hは、基本的にMicrosoft Visual Studioで使用され、一度コンパイルされたファイルをコンパイラーに知らせ、最初からコンパイルする必要はありません。あなたはそれについてもっと読むことができます
http://www.cplusplus.com/articles/1TUq5Di1/
https://docs.microsoft.com/en-us/cpp/ide/precompiled-header-files?view=vs-2017