2012-07-09 14 views
11

私は今日、初めてコンパイルされたヘッダーに走りました。私のC++コードをコンパイルするのはそれほど高速かもしれません。ヘッダーファイルのプリコンパイル済みヘッダー

とにかく私が今まで読んだことは、あらかじめコンパイルされたヘッダーだけがソースファイル(cpp?)に追加されるべきだということです。

Visual Studioでは、[プロジェクトのプロパティ] - > [C/C++] - > [拡張子を含むファイル]のオプションがあります。コンパイラオプションをstdafx.hに設定しました。

この後、ヘッダーファイル(ソースファイルにはstdafx.hが自動的にインクルードされるはずです)でも、私がstdafx.hに追加したヘッダーを含める必要はなくなりました。これは予想される動作ですか?

ヘッダー/ソースファイルの違いでわかりにくい場所が見つかりません。

もしそれがあれば、それはもう一つのことだと思います.VC++では、あなたは離れていくことができますが、GCCで壊れます。そして、はい。それはポータブルにする必要があります。少なくともGCCとVC++の間で。

+1

もしもあなたのプロジェクトがgccで動くようにしたいのであれば、 "Include File"オプションから遠ざける方がよいでしょう。ボイラープレートは、ソースコードファイルの最初の#includeをプリコンパイル済みヘッダーファイルにすることです。 –

+2

@ハンスと同等のgcc機能は、すべてのファイルの先頭に* stdafx.h *をインクルードするために '-include'コマンドラインオプションを使うことです。 –

答えて

13

StdAfx.hは、実際にはヘッダーではなく、ソースファイルにのみ含める必要があります。私は#include "StdAfx.h"を最初にすべてのcppで使用しないで "Force Include File"オプションを使用することをお勧めします。それは私のクロスプラットフォームのプロジェクトでどうしているのですか?レコードのために、私は実際にはGCCでプリコンパイルされたヘッダを使用しません。通常はそれを構築し、うまく動作します。

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

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

+0

私の質問は、VC++がこれらを自動的にヘッダーに追加することでしたか?私は含まれていない(しかし、stdafx.hにある)型を使うとエラーは出ません。非常に奇妙です。 – irwinb

+2

いいえ、force includeオプションは、ファイルをすべてのソース/ cppファイルの最初の行に追加します。作業を含む方法は、インクルードされるファイルの内容が#includeの場所にあるソースファイルに置かれることです。すべてのCPPファイルの先頭にStdAfx.hの内容があり、すべてのヘッダーファイルとソースコード(ファイル内の順序どおり)の内容が続きます。その効果は、あなたのStdAfx.hで定義されているすべてが、そのプロジェクト内のヘッダーで利用できるようになります。コンパイラはヘッダーではなくソースファイルのみを参照します。 – syplex

+0

ありがとうございます。それは完璧な意味合いがあります。あなたの説明をありがとう。 – irwinb

4

はい、動作が予期されています。プロジェクトのプロパティ - > C/C++ - >詳細には、「強制インクルードファイル」の設定コントロールVisual C++ compiler option /FI

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

これで、stdafx.hを手動で含めることができなくなりました。

GCCと他のコンパイラでプリコンパイルされたヘッダを使用することもできますが、 Visual C++のショートカット動作は他のコンパイラ間で移植できません。したがって、ポータブルソリューションのアイディアについては、How to handle stdafx.h in cross-platform code?を参照してください。

短い話ですが、.cppソースファイルにstdafx.hを手動でインクルードしてください。GCCでもうまくいくはずです(GCCのビルドでプリコンパイル済みヘッダーを使用すると仮定します)。

+0

.hと.cppファイルの両方への広告? – irwinb

+0

@irwinb .cppファイルに。回答も更新されました。 – mloskot

+0

.cppファイルのみを追加する場合、VC++ okを使用してヘッダーファイルにこれらのタイプの減速があるのはなぜですか? – irwinb

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"を参照してくださいだけで、ソースファイルの最初の非コメント行として発見されなければなりませんヘッダーファイルには含まれません。

関連する問題