2009-03-24 18 views
30

私はstdafx.hを含む多くのコードを参照してください。いいえ、私はではありませんは、事前にコンパイルされたヘッダーが欲しいです。そして私はが必要なすべてのシステムヘッダーを自分で手動で取り込みます。その場合は、私がどこの場所に気をつけなければならない他の良い理由がありますかstdafx.hstdafx.h:いつ必要なのですか?

+0

既にプリコンパイル済みヘッダーを使用している場合は、プロジェクトのプロパティC/C++およびプリコンパイル済みヘッダーに移動し、使用しないオプションを選択します。 – MirroredFate

+0

NovisのStdAfx.h:http://www.cplusplus.com/articles/2z86b7Xj/ –

答えて

16

プリコンパイル済みヘッダーを使用しない場合は、標準インクルードファイルを使用する必要はありません。これにより、インクルードファイルを含むすべてのファイルのビルドが遅くなり、余分なものが含まれます必要。それを取り除き、必要なヘッダーだけを含めてください。

2

プレコンパイルされたヘッダーがなくても、stdafx.hはヘッダーインクルードとすべてのファイルに共通の定義をグループ化するので便利です。

もちろん、すべてのファイルでこれらの定義をすべて繰り返すこともできます。 stdafx.hは厳密には必要ではありません。

+0

悪い習慣 - モジュールの依存関係をチェックできるように、必要なヘッダーを常に明示的にリストする必要があります。 – snemarch

+0

stdafxには通常、すべてのファイルに共通のプラットフォーム固有の定義が含まれています。これはすべてのファイルの「依存性」です。すべてのファイルで定義を繰り返さないために使用します。これは良い習慣です。なぜなら、あなたはそれを1か所だけで行うからです。 – kgiannakakis

+0

すべてのファイルがstdafxのすべてのヘッダーを実際に必要としない限り、すべてのファイルの依存関係ではありません。実際には、これはまれです(IME)。この方法でそれを使用するのは悪いことですが、悪い練習は最悪です – Patrick

2

stdafx.hは単なる別のヘッダーファイルです。落ちた場合は、それを含めずにプロジェクトから削除することは自由です。

しかし、stdafx.hのようなファイルは、プリコンパイルされたヘッダーが正しく動作するように、そして各ソースファイルにすべてのものを手動で含めるのが一般的です。

1

他にも言及したように、プリコンパイルされたヘッダーが必要ない場合、stdafx.hは本当に必要ありません。共通のインクルードをグループ化するだけでは、実際にはかなり悪い習慣です。

実際、プリコンパイルされたヘッダーを使用する場合でも、stdafx.h(またはプリコンパイルされたhなど)の後にプロセスが実際に必要とするヘッダーを、プリコンパイルされた#ifdefマジックと共に含めることをお勧めしますヘッダーを使用してPCHの使用をオフにします。

なぜですか?あなたのモジュールの依存関係をチェックするために。 PCHを無効にすることができるので、必要なモジュールが含まれているかどうかを知ることができ、.cppと.hファイルを解析することでモジュールの相互依存性をチェックするツールを書くことができます。

+1

C + +パーサーを書くことは時間の巨大な利益です......... – Virus721

2

stdafx.hを使わずに(あまりにも嫌なことに)あらかじめコンパイルされたヘッダを使うことができます。私はVC++ 6.0にしかアクセスできませんでしたが、Project Settings | C/C++ | Precompiled Headersに行き、 "precompiled headerの自動使用"を選択しますが、 "compiled through"ボックスは空のままにしておきます。

0

私はこれが古いスレッドだと知っていますが、読者に私の意見を伝えたいと思いました。私は2017年にこれを見つけたので、私はここにいる唯一の人ではないと確信しています。

プレコンパイルされたヘッダーを使用する利点があります。これは、長年実践してきたために見落とされる可能性があります。 C++標準は大きく進化しました。あなたが必要とする可能性のある20個のファイルにベクトルを含めるのではなく、PCHファイルを使用し、コンパイラの作業量が少なくなければならず、それは誰にとっても幸せな顔になります。また、VERIFY、ASSERT、スマートクラスオブジェクトなど、共通のマクロをそこに配置することもできます。クラスヘッダーをそこに置かないでください。標準ライブラリや、私が言及したマクロのような多くの場所でグローバルに使う必要があるものは意味がありません。

は、iostream、string、vectorなど、必要なすべてのファイルに必要なヘッダーを含めることで、これをファイルにインラインで効果的にコンパイルします。 「Pre Compiled」ヘッダーを含めて、名前だけでそこに鐘が鳴るようにしてください。

関連する問題