Visual Studioで使用される「stdafx.h」とは何ですか?


500

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

何にstdafx.h使用されますか?このヘッダーファイルを削除してもよろしいですか?


2
私はstdafx.hをに関連するコンパイルエラーが出た場合、私は一般的に..このファイルを作成したり、使用しないように設定を設定する
phoad

6
記事:初心者向けのStdAfx.h-viva64.com/en/b/0265

他のプラットフォームでは正常にヘッダーファイルを使用できますが、それらは通常のヘッダーファイルです。パフォーマンス上のメリットはありません。
アンドレア

回答:


826

すべての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に依存しないライブラリを作成する場合は、簡単にコメント化したり#includestdafx.hファイルからを削除したりできます。ファイル自体を削除する必要はありませんが、上記のプリコンパイルヘッダー設定を無効にすることで、ファイルを削除することもできます。


6
あなたはstd名前空間からのファイルのためだけに使用している場合でも、あなたはスピードの恩恵を得る
ギタ

11
omg、非常に良い答えindeed.iは、標準に準拠したcコンパイラを探していました。プロジェクトのプロパティからmicro $ oft拡張機能を無効にして、コンパイラを「auto」から「c」に変更すると、「標準」のコンパイラとIDEをほぼ使用できることがわかります。
EKanadily 2014

4
@Rishi: 'line'とはどういう意味#include "stdafx.h"ですか?もちろん、それは単なる標準の#includeです。「MS拡張機能」の部分は、コンパイラのパフォーマンス最適化にすぎません。たまたま "stdafx.h"と呼ばれるヘッダーファイルを持つセマンティクスは変更されません。インクルードを削除し、コードがstdafx.hを介してインクルードされたものに依存している場合は、直接インクルードする必要があることに注意してください。
Euro Micelli、2014

4
@ Youda008、真実ではない。コードファイルをコンパイルする前に、ヘッダーの内容は#include、ソースファイル内の場所に単純かつ文字どおり「貼り付け」られます(マクロを評価するのと同じ「プリプロセッサー」ステップで行われます)。結果の合計ファイルは、実際のコンパイラに渡されます。コンパイラは、ヘッダーファイルを別のエンティティとして認識しません。ヘッダーファイルに宣言を置くのは、ヘッダーファイルでうまく機能するためです。これは従来の規則です。それを試してみてください!プログラム全体でヘッダーファイルを作成し、#includeのみを含むソースファイルを作成します。正常にコンパイルされます。
Euro Micelli 2014

28
歴史的な好奇心。stdafx.hの名前は、MFCがリリースされる前に 'Application Framework Extensions'と呼ばれていた1992年頃のものです。名前へのVisual Studio 2015はまだデフォルト...
KERT

48

これは「プリコンパイル済みヘッダーファイル」です。stdafx.hに含めるすべてのヘッダーは、後続のコンパイル中の時間を節約するために前処理されます。詳細については、MSDNを参照しください

クロスプラットフォームアプリケーションを構築している場合は、プロジェクトの作成時に「プロジェクトを空にする」をオンにすると、Visual Studioはプロジェクトにファイルを一切配置しません。


15
このファイルには、他のプラットフォームでは機能しないものはありません。コンパイラーがプリコンパイル済みヘッダーをサポートしていない場合は、コンパイルが遅くなる可能性がありますが、壊れないはずです。これは、他のヘッダーファイルを含む単なるヘッダーファイルです。
2011年

2
@detunized:たぶん私の答えがそうでなければ聞こえたので、その部分を明確にしてくれてありがとう。
カサブランカ、2011年

3

"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


-10

私は自分で最低限のフレームワークを作成しようとしているのでこれに遭遇しましたが、Visual Studio 2017で新しいWin32プログラムオプションを作成することから始めました。「stdafx.h」は不要であり、削除する必要があります。次に、ソリューションエクスプローラーにある愚かな "stdafx.h"と "stdafx.cpp"をプロジェクトから削除することができます。その場所に、あなたは置く必要があります

#include <Windows.h>

代わりに。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.