があるので、使用前のコンパイルされたヘッダーでVC++を必要とせずstdafx.h?
-
08-07-2019 - |
質問
私のバンチのレガシーコードを必要とすることを書くのユニットテストします。を用いたヘッダをもうほとんどです。cppファイルdependecyにstdafx.hるのが困難にな休憩の依存関係を書くため、試験までを実施。
私の初めての本能は全て取り除くこれらのstdafx.hファイルに含まれる#ディレクティブやその#を含み直接のソースファイルとして必要です。
このよう必要があoffたはヘッダーからの依存度を持つファイルのようなstdafx.hする場所を決めるたヘッダを停止します。
あいち早く入手することができたヘッダなしのstdafx.h依存関係は?であり、より良いアプローチですが。
解決
はい、もっと良い方法があります。
プリコンパイル済みヘッダーの「ウィザードスタイル」の問題は、不必要な結合を促進し、コードを本来よりも再利用しにくくすることです。また、「stdafx.hにすべてを貼り付ける」スタイルで記述されたコードは、ヘッダーファイルのすべてを変更するとコードベース全体が毎回再コンパイルされる可能性が高いため、維持するのが面倒です。これにより、各変更と再コンパイルのサイクルに必要以上に時間がかかるため、単純なリファクタリングに永遠に時間がかかる可能性があります。
より良い方法は、やはり私見ですが、#pragma hdrstopと/ Ycと/ Yuを使用することです。これにより、プリコンパイル済みヘッダーを使用するビルド構成と、プリコンパイル済みヘッダーを使用しないビルド構成を簡単にセットアップできます。プリコンパイル済みヘッダーを使用するファイルは、ソースファイル内のプリコンパイル済みヘッダー自体に直接依存していないため、プリコンパイル済みヘッダーの有無にかかわらずビルドできます。プロジェクトファイルは、どのソースファイルがプリコンパイル済みヘッダーを構築するかを決定し、各ソースファイルの#pragma hdrstop行は、プリコンパイル済みヘッダー(使用する場合)から取得するインクルードとソースファイルから直接取得するインクルードを決定します...メンテナンスを行う場合、プリコンパイル済みヘッダーを使用しない構成を使用し、ヘッダーファイルの変更後に再構築する必要があるコードのみが再構築されます。フルビルドを行う場合、プリコンパイル済みヘッダー構成を使用して、コンパイルプロセスを高速化できます。プリコンパイルされていないヘッダービルドオプションを使用することのもう1つの良い点は、cppファイルに必要なものだけが含まれ、必要なものすべてが含まれるようにすることです(プリコンパイル済みヘッダーの「ウィザードスタイル」を使用する場合は難しいことです
これがどのように機能するかについて少し書いた: http://www.lenholgate.com/blog/2004/07/fi-stlport-precompiled-headers-warning-level-4-and-pragma-hdrstop。 html (/ FIに関する情報は無視してください)と#pragma hdrstopおよび/ Yc / Yuメソッドを使用してビルドするプロジェクト例があります: http://www.lenholgate.com/blog/2008/04/practical-testing-16 --- fixing-a-timeout-bug.html 。
もちろん、「ウィザードスタイル」プリコンパイル済みヘッダーの使用からより制御されたスタイルへの移行は、多くの場合簡単ではありません...
他のヒント
きを正常に利用コンパイル済みヘッダ"stdafx.h"は、2つの目的このセットを定義し、安定した普通などのファイルです。もされています。cppファイルとして、マーカーとして、プリコンパイル済みヘッダー終了です。
音のようにしたいことです:
- 休コンパイル済みヘッダーを出します。
- の"stdafx.h"が含まれています。cppファイルです。
- 空の容から"stdafx.h".
- います。cppファイル、図していないよう、それが必要なのは、古くから"stdafx.h".追加される前に#include"stdafx.hされています。cppファイルです。
そのための最小セットのdependancies、まだ利用のコンパイル済みヘッダを含みます。の損失となprecompiling目的当社は、次の目的でお客さまセットのヘッダだけます。その一環として行われた大ヒットのためのフルしまいます。開発のモードである場合にのみの再コンパイルを伴わずかのファイルに同時に、将来的にご検討されているのです。
いいえ、おそらくもっと良い方法がありますない。
ただし、特定の個々の.cppファイルについては、プリコンパイル済みヘッダーは必要ないと判断する場合があります。その1つの.cppファイルの設定を変更し、stdafx.h行を削除できます。
(ただし、実際には、プリコンパイル済みヘッダースキームがユニットテストの記述を妨げることはありません。)
いいえ。プリコンパイル済みヘッダーは、この方法でコンパイルされたすべてのソースに含まれる単一のヘッダーに依存します。 単一のソース(またはすべて)に対して、プリコンパイル済みヘッダーをまったく使用しないように指定できますが、それは望みではありません。
これまで、Borland C ++コンパイラは特定のヘッダーなしでプリコンパイルを行いました。ただし、2つのソースファイルに同じヘッダーが含まれていても順序が異なる場合、C ++のヘッダーファイルの順序が重要になる可能性があるため、別々にコンパイルされました...
したがって、同じ順序でソースを非常に厳密にインクルードするか、他のすべてのファイルに単一のインクルードファイルを(最初に)含めた場合にのみ、ボーランドのプリコンパイル済みヘッダーが時間を節約したことを意味します... ?!
はい。 " stdafx.h / stdafx.pch"名前は単なる慣習です。各.cppに独自のプリコンパイル済みヘッダーを付けることができます。これはおそらく、.vcproj内のXMLを編集する小さなスクリプトで達成するのが最も簡単でしょう。マイナス面:プリコンパイル済みヘッダーの大きなスタックになり、TU間で共有されません。
可能ですが、スマートですか?確かに言えません。
私のアドバイスは-ビルドを苦痛なほど遅くしたくない限り、プリコンパイル済みヘッダーを削除しないでください。基本的にここには3つのオプションがあります:
- プリコンパイル済みヘッダーを削除する(非推奨)
- レガシーコード用に個別のライブラリを作成します。そうすれば、個別にビルドできます。
- 単一のプロジェクト内で複数のプリコンパイル済みヘッダーを使用します。ソリューションエクスプローラーで個々のC ++ファイルを選択し、使用するプリコンパイル済みヘッダーを指定できます。また、OtherStdAfx.h / cppをセットアップして、プリコンパイル済みヘッダーを生成する必要があります。
プリコンパイル済みヘッダーは、すべてに同じものが含まれるという考えに基づいています。事前にコンパイルされたヘッダーを使用したい場合、これが意味する依存関係に対応する必要があります。依存関係とビルド速度のトレードオフに帰着します。プリコンパイル済みヘッダーをオフにして妥当な時間内にビルドできる場合は、必ずそれを実行してください。
考慮すべきもう1つの点は、ライブラリごとに1つのpchを使用できることです。そのため、コードをより小さなライブラリに分割し、各ライブラリの依存関係をより厳密に設定できる場合があります。
afx ___を含める必要のあるコードにはプリコンパイル済みヘッダーのみを使用します。通常はUIのみで、単体テストは行いません。 UIコードはUIを処理し、単体テストを持つ関数を呼び出します(ただし、ほとんどの場合、アプリがレガシーであるため現在はそうではありません)。
コードの大部分では、プリコンパイル済みヘッダーを使用しません。
G。
プリコンパイル済みヘッダーはプロジェクトの再構築時に多くの時間を節約できますが、プリコンパイル済みヘッダーが変更されると、ヘッダーに依存するすべてのソースファイルが、変更が影響するかどうかにかかわらず再コンパイルされます。幸いなことに、プリコンパイル済みヘッダーは link ではなく、コンパイルに使用されます。 すべてのソースファイルは、事前にコンパイルされた ヘッダーを使用する必要はありません。
pch1.h:
#include <bigHeader1.h>
#include ...
pch1.cpp:
#include "pch1.h"
source1.cpp:
#include "pch1.h"
[code]
pch2.h:
#include <bigHeader2.h>
#include ...
pch2.cpp:
#include "pch2.h"
source2.cpp
#include "pch2.h"
[code]
pch1.cpp を選択して右クリックし、プロパティ、構成プロパティ、C / C ++、プリコンパイル済みヘッダーを選択します。
プリコンパイル済みヘッダー:作成(/ Yc)
プリコンパイル済みヘッダーファイル: pch1.h
プリコンパイル済みヘッダー出力ファイル:$(intDir)pch1.pch
source1.cpp を選択します
プリコンパイル済みヘッダー:使用(/ Yu)
プリコンパイル済みヘッダーファイル: pch1.h
プリコンパイル済みヘッダー出力ファイル:$(intDir)pch1.pch(これは/ Yuにとって重要ではないと思う)
pch2.cpp と source2.cpp について同じことを行いますが、ヘッダーファイルとヘッダー出力ファイルから pch2.h および pch2.pch へ。それは私のために働く。