14

今日、初めてプリコンパイル済みヘッダーに出くわしました..私の人生を永遠に変えてしまいました. C++ コードのコンパイルがこれほど高速であるとは信じられません。今では完全に理にかなっています..

とにかく、私を混乱させていることの 1 つは、これまで読んだことから、プリコンパイル済みヘッダーのみをソース ファイル ( cpp? ) に追加する必要があることです。

Visual Studio では、[Project Properties] -> [C/C++] -> [Advanced] の下に [Force Include File] のオプションがあります。そのコンパイラ オプションをstdafx.hに設定しました。

これを行った後..ヘッダーファイル内であっても、 stdafx.hに追加したヘッダーを含める必要がなくなりました(ソースファイルには stdafx.h が自動的に含まれることになっています)。これは予想される動作ですか?

ヘッダー/ソース ファイルの区別が明確な場所が見つかりません。

もしそうなら..素晴らしいですが、残念ながらVC++で回避できるものの1つであると思いますが、GCCでは壊れます。はい、移植可能である必要があります。少なくとも GCC と VC++ の間。

4

3 に答える 3

19

StdAfx.hは、実際にはソースファイルにのみ含める必要があり、ヘッダーには含めないでください。すべてのcppの最初に「StdAfx.h」を#includeし、「ForceIncludeFile」オプションを使用しないことをお勧めします。それが私のクロスプラットフォームプロジェクトでのやり方です。ちなみに、私は実際にはGCCでプリコンパイル済みヘッダーを使用していません。通常どおりにビルドするだけで、うまく機能します。

いくつかの背景について。コンパイラはソースファイル(つまり、*。cpp、*。cなど)のみを参照するため、それらをコンパイルするときに、すべてのヘッダーを含め、ヘッダーにあるコードもコンパイルする必要があります。プリコンパイル済みヘッダーオプションを使用すると、そのすべてのコード(つまり、StdAfx.hにグローバルに含まれるコード)を一度コンパイルできるため、常に実行する必要はありません。それがStdAfx.cppの目的です。コンパイラは、ビルドするたびに実行する必要はなく、StdAfx.hに含まれるすべてのコードを使用してStdAfx.cppを一度コンパイルします。

したがって、最初の項目としてすべてのソースファイルにStdAfx.hを含めるため、StdAfx.hの後に含まれるため、すべてのコードにアクセスできるため、ヘッダーに含めることは意味がありません。 StdAfx.hで。さらに、StdAfx.hが周りにあることや、間違ったヘッダーが含まれていることを心配することなく、他のプロジェクトでこれらのヘッダーを使用できます。

于 2012-07-09T21:48:48.713 に答える
5

はい、これは予期された動作です。[プロジェクト プロパティ] -> [C/C++] -> [強制的にインクルード ファイル] 設定に進むと、Visual C++ コンパイラ オプション /FIが制御されます。

このオプションは、すべてのソース ファイルの最初の行の #include ディレクティブで二重引用符を使用してファイルを指定するのと同じ効果があります。

そのため、手動で stdafx.h を含める必要がなくなります。

ただし、GCC およびその他のコンパイラでプリコンパイル済みヘッダーを使用できます。Visual C++ のショートカット動作は、他のコンパイラ間で移植できません。したがって、クロスプラットフォーム コードで stdafx.h を処理する方法を確認してください。ポータブル ソリューションのアイデアが議論されています。

簡単に言うと、stdafx.h を .cpp ソース ファイルに手動でインクルードすれば、GCC でも問題ないはずです (GCC 用にビルドを構成して、プリコンパイル済みヘッダーを使用すると仮定します)。

于 2012-07-09T21:26:29.730 に答える
2

「ファイルを強制的に含める」設定 (/FI) は使用しないでください。エディット コンティニュが機能しなくなるためです。(そして、MS はこの問題を修正したくないようです)

https://connect.microsoft.com/VisualStudio/feedback/details/668339/vs-2010-sp1-c-edit-and-continue-fails-with-fiを参照して ください

および https://connect.microsoft.com/VisualStudio/feedback/details/342441/visual-studio-2005-force-includes-breaks-edit-and-continue-with-pre-compiled-headers

#include "stdafx.h"ヘッダー ファイルではなく、ソース ファイルの最初の非コメント行としてのみ見つける必要があります。

于 2014-05-13T12:32:27.737 に答える