プリコンパイルされたヘッダーの目的は、すでにコンパイルされたオブジェクトファイルを実際のプロジェクトにリンクすることによって、コンパイルプロセスを高速化しようとしていることです。しかし、私は理解していないことVisual StudioでVisual Studioにstdafx.h
を明示的に適用する必要があるのはなぜですか(Project Properities - > C/C++ - > Precompiled Headers - > Precompiled Header)? #include "stdafx.h"
で十分ではないのはなぜですか?stdafx.hをVisualStudioに含めることができないのはなぜですか?
答えて
いわゆるstdafx.h
は、通常のヘッダーファイルと見なされます。名前には特別なものは何もありません。プリコンパイル済みヘッダーを自動的に有効にすることは想定されていません。
stdafx.h
は、他のコンパイラでは通常のヘッダーファイルと見なされますが、MSVCでプリコンパイラヘッダーを使用しない場合は考えられます。
それはあるあなた、あなたが実際には、プリコンパイル済みヘッダーを有効にするMSVCコンパイラに伝えることになっている。それはまさにあなたがそのプロジェクト設定を持っている理由です。そして、プリコンパイルされたヘッダを有効にした場合にのみ、stdafx.h
は特別な役割を果たし、コンパイラから特別な扱いを受けます。そして、それは必ずしもstdafx.h
ではありません。プロジェクト設定で別の名前を指定することによって、この特殊な役割を他のヘッダーに割り当てることができます。
実際には、Microsoft固有のライブラリやフレームワークとは関係のないプロジェクトでAFXへの参照を参照するのは非常に奇妙です。
正確な特別扱いが 'stdafx.h'をコンパイラから受け取るのはもっと具体的なものでしょうか?古典的なコンパイルリンクプロセスとはどのように違いますか? –
@Wakan Tanka:ヘッダーのプリコンパイルは "リンク"とは関係ありません。それはまったく別のプロセスです。 'stdafx.h 'が受け取る"特別扱い "は、基本的にその内容が*プリコンパイル*され、プリコンパイルされた形式で使用されます。それがすべてです。 – AnT
"MSVCコンパイラに実際にプリコンパイル済みヘッダーを有効にしたいと言っているのはあなたです。" '#include" stdafx.h "'を実行したときにMSVCに伝えていませんか? –
なぜ、
#include "stdafx.h"
[...]で十分ですか?
これは単なる標準のC++プリプロセッサディレクティブなので、 *コンパイラに関しては、#include <string>
と変わりありません。追加のセマンティクスをアタッチする必要がある場合は、コンパイラにそのことを伝える必要があります。
Visual Studioがプリコンパイル済みヘッダーを実装する方法が混乱しているように見えるので、ここにはドキュメントへのリンクがあります。Creating Precompiled Header Files
*マインドあなたは、それがPCHを生成するために使用されるデフォルトのヘッダーの名前であること以外の名前"stdafx.h"
について何も特別なことは、ありません。
私のVisual Studioプロジェクトでは、PCHヘッダーは 'stdafx.h 'という名前でもありません。私はPCHヘッダーの名前を指定するCMakeでマクロを使用しますが、 – drescherjm
申し訳ありませんが、私は従いません。追加の意味は何ですか?コンパイラは単に '#include" stdafx.h "を" stdafx.h "の内容で置き換えます。この時点から、 'stdafx.h 'で宣言された関数を呼び出すことができ、コンパイラは文句を言うことはありません。コンパイル後、 'stdafx.obj'ファイルは私のプロジェクトにリンクされています。ここに明示的に何かを指定する必要はありません。 –
@WakanTanka:**標準**セマンティクスについて説明しました。追加のセマンティクスは、コンパイラが '#include'指示文を**前処理された**と**プリコンパイルされた**バージョンのヘッダで置き換えることです。また、ヘッダファイルはコンパイル単位ではありません。 * "stdafx.obj" *ファイルはありません(PCHの場合は* stdafx.cpp *ファイルも用意していない限り)。 .objファイルはPCHとは関係ありません。 – IInspectable
プリコンパイル済みヘッダーを安全に使用できるかどうかは、簡単には解答できません。あなたのヘッダーがあるとします。
#ifndef FOO
void foo();
#endif
ここで、このヘッダーをプリコンパイルするとします。
別のソースファイルでは、ヘッダーを含める前にFOO
を定義することを止めるものはありません。その場合、コンパイルされたヘッダーは使用しないでください。コンパイラーが知ることができる唯一の方法は、ヘッダーのどこでも使用されている各マクロをすべて追跡する場合です。
これは多くの作業です。 GCCはこれを行いますが、Microsoftはそうしないことを選択しました。
プリコンパイルされたヘッダーは、いくつかの特定のシナリオでのみ使用できると言っても過言ではありません。大きなユースケースは、これらのいくつかの特定のシナリオでカバーされていれば十分です。
- 1. なぜこの.hを含めることができないのですか?
- 2. なぜ私はsidenavを含めることができないのですか?
- 3. なぜ私はブログを含めることができないのですか?
- 4. ジェネリックメソッドを非ジェネリッククラスに含めることができないのはなぜですか? C#ので
- 5. カスタムフレームワークを埋め込むことができないのはなぜですか?
- 6. Visual Studio C++で、必要がないファイルでも「StdAfx.h」を含める必要があるのはなぜですか?
- 7. where where条件にnull値を含める/含めないSQLショートカットがないのはなぜですか?
- 8. Cヘッダーファイルにfreetypeヘッダーファイルを含めると、エラーが発生しますが、.cファイルに含めることができるのはなぜですか?
- 9. stdafx.h:いつ必要なのですか?
- 10. なぜこのコードで画像を円に丸めることができないのですか?
- 11. なぜVisualStudioではコンパイルボタンが無効になっていますか?
- 12. ハンドラを含めないのはなぜですか?
- 13. 条件付きでstdafx.hをインクルードした後にコンパイルエラーが発生するのはなぜですか?
- 14. なぜこの行に入ることができないのですか?
- 15. VisualStudioでクリック可能なリンクを含める方法QuickInfo
- 16. DJangoデベロッパーサーバーでSTATIC_URLを 'http://'または '/'で始めることができないのはなぜですか?
- 17. エミュレータでビデオを見ることができないのはなぜですか?
- 18. MS Visual Studio#はデフォルトでstdafx.hの#<stdio.h>を含むのはなぜですか?
- 19. FormsAuthentication.Authenticateをデバッグ/ステップインすることができないのはなぜですか?
- 20. なぜこのミニクラフトモッドを作ることができないのですか?
- 21. なぜコンパイラが変換を狭めることができるのですか
- 22. UITableViewCell内のUIViewで2つの上隅を丸めることができないのはなぜですか?
- 23. なぜ値型をnullにすることができないのですか
- 24. ハンドルバーをループさせることができないのはなぜですか?
- 25. PropType.funcを読み取ることができないのはなぜですか?
- 26. TH runat = "server"を作ることができないのはなぜですか?
- 27. Xunit.netをVIsualStudio 2013にインストールできない
- 28. はvar_promptをロールに含めることができますか?
- 29. PHPでselfを返すことができないのはなぜですか?
- 30. とにかくjavascriptコードを含むことができないときに、coffeescriptファイルに.js.coffee拡張子を使用しているのはなぜですか?
PCHを作成するかどうかIDEに指示する必要があります。 –
盲目的に投票票を下げないでください。何が改善されるべきかのヒントを提供してください。ありがとう –