537

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

何にstdafx.h使われますか?このヘッダーファイルを削除しても大丈夫ですか?

4

5 に答える 5

879

すべてのC++コンパイラには、対処すべき重大なパフォーマンスの問題が1つあります。C ++コードのコンパイルは、長くて時間がかかるプロセスです。

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

これはWindowsに固有のものではありませんが、Windowsのような大規模なAPIに対してコンパイルする必要があるすべてのコンパイラが直面する古い問題です。

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

コンパイラーは、すべてのCppファイルに加えて、その数十のインクルードを文字通りゼロから毎回コンパイルし始める必要がない場合、大幅な時間の節約になります。

秘訣は、すべてのコンパイルチェーンの開始点として特別なヘッダーファイル、いわゆる「プリコンパイル済みヘッダー」ファイルを指定することです。これは、歴史的な理由から、通常はstdafx.hという名前のファイルです。

APIのすべての大きな巨大なヘッダーをstdafx.hファイルに適切な順序でリストし、#include "stdafx.h"意味のあるコンテンツの前に、各CPPファイルの一番上から開始します(これまでに許可されているのは、コメント)。

これらの条件下では、コンパイラは最初から開始するのではなく、ですべてをコンパイルした結果からコンパイルを開始しますstdafx.h

このトリックがMicrosoftコンパイラに固有のものであるとは思わないし、独自の開発でもなかったと思います。

Microsoftコンパイラの場合、プリコンパイル済みヘッダーの使用を制御する設定は、コンパイラへのコマンドライン引数によって制御されます/Yu "stdafx.h"。ご想像のとおり、stdafx.hファイル名の使用は単なる慣例です。必要に応じて名前を変更できます。

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

プリコンパイル済みヘッダーを無効にした場合(またはそれらをサポートしていないツールを使用してプロジェクトを実行した場合)、プログラムが違法になることはありません。これは単に、ツールが毎回すべてを最初からコンパイルすることを意味します。

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

于 2011-01-18T17:07:42.630 に答える
51

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

クロスプラットフォームアプリケーションを構築している場合は、プロジェクトを作成するときに[プロジェクトを空にする]をオンにすると、VisualStudioはプロジェクトにファイルをまったく配置しません。

于 2011-01-18T16:03:47.687 に答える
4

「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

于 2018-12-22T19:34:57.963 に答える
1

定義:「Stdafx.h」はプリコンパイル済みヘッダーです。

  • プリコンパイル済みとは、一度コンパイルすると、再度コンパイルする必要がないことを意味します。
  • stdafx.hは、基本的にMicrosoft Visual Studioで使用され、ファイルが一度コンパイルされ、最初からコンパイルする必要がないことをコンパイラに通知します。

例:以下のWindowsヘッダーファイルをインクルードする場合。

コード:

#include <windows.h>
#include <string.h>

int main()
{
 //your code
return 0;
}
  • コンパイラは常にこれらのヘッダーファイルを最初からコンパイルします。
  • ただし、これらのヘッダーの前に#include "stdafx.h"をインクルードすると、コンパイラはstdafx.hからコンパイルされたヘッダーファイルを検索し、最初からコンパイルしません。
  • 初めて、コンパイラは通常どおりゼロからコンパイルします。

コード:

#include "stdafx.h"
#include <windows.h>
#include <string.h>

int main()
{
//your code
 return 0;
}

利点:

  • コンパイル時間を短縮します。
  • 不必要な処理を減らします。

ソース:http ://www.cplusplus.com/articles/1TUq5Di1/

于 2021-06-27T09:31:12.517 に答える
-14

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

#include <Windows.h>

代わりは。

于 2017-05-04T19:08:39.893 に答える