6

ここ数日間、learncpp.com tuts をフォローしていて、Code::Blocks の .cpp ファイルから "#include "stdafx.h" をコメントアウトするように言われています。

インクルード行を削除するには、それは必須ですか? 何百ものファイルがあり、Win7 の Visual Studio から Linux の Code::Blocks に変更したり、Mac を使用している他の人に渡したりするとどうなりますか?

4

5 に答える 5

11

stdafx.h is the idiomatic name used for precompiled headers in the Visual Studio ecosystem. In a nutshell, it's a regular header, but the contents of this file will be compiled once and reused for all cpp files in the project.

That is useful since in most projects, a large number of headers (standard library, system header, shared project-wide definitions) are used by virtually all translation units (cpps), so using PCH is a huge performance benefit during compilation

(Actually, PCH is a hack to workaround C++' inefficient compilation and linkage model and it's a shame that we need to maintain it by hand … oups, blasphemy.)

But this also means that - as long as the contents of your stdafx.h are gcc-compatible - compilation with CodeBlocks should still work, but without the immediate performance benefit.

The stdafx.h generated by VS' app wizards doesn't work out of the box on other platforms - it typically includes Windows.h. So to make it work, guard the Windows-specific definitions with appropriate #ifdef/#endif pairs and vice versa for Linux or Mac-specific stuff.

于 2011-03-10T18:21:14.020 に答える
4

いいえ、そのチュートリアルのアドバイスは意味がありません。stdafx.h何も壊しません。Visual Studio コンパイラのプリコンパイル済みヘッダーのシステムは、意図的にそのように設計されています。

コンパイラがプリコンパイル済みヘッダーをサポートしている場合 (および Visual Studio と同じプリコンパイル アプローチに従っている場合)、stdafx.hプリコンパイルに使用できます。

コンパイラがプリコンパイル済みヘッダーをサポートしていない場合 (または別のプリコンパイル アプローチを使用した場合)、stdafx.hは通常のヘッダー ファイルとして解釈され、他のヘッダー ファイルと変わらず、他のヘッダー ファイルと同じ方法で処理されます。

そのチュートリアルが意味することは、stdafx.h多くの場合、他のプラットフォームには存在しない Windows 固有のヘッダーが含まれている可能性があります。stdafx.hそれは可能ですが、それ自体にはまったく関係がありません。明らかに、他のプラットフォームでプログラムをコンパイルしている場合は、どのように実行しているかに関係なく、Windows ヘッダーを含めようとしないでくださいstdafx.h

于 2011-03-10T18:28:36.117 に答える
1

私の知る限り、stdafx.h(プリコンパイル済みヘッダー用の) Windows 専用ファイルです: コメントアウトしないと、コードはコンパイルに失敗します。

于 2011-03-10T18:17:56.287 に答える
1

実際に行う唯一のことは、デフォルトのインクルード パス リストに stdafx.h (またはプリコンパイル済みヘッダー) を含むパスを含めることです。これが必要なのは、MS コンパイラが#include "stdafx.h"ヘッダーを実際に検索せずにプリコンパイル済みデータに実際に置き換えるためです。

他のコンパイラは通常、データを取り込もうとします。ただし、コメントアウトしないでください。通常、コンパイラを調整して、プリコンパイル済みヘッダー機能を利用してコンパイルを強化することもできます。それはオプションでgcc行われ-pchます。Code Blocks を使用すると、この wikiを見つけることができました。プリコンパイル済みヘッダーは悪ではありません。逆に、適切に理解して使用すれば、貴重な時間を節約できます。

于 2011-03-10T18:24:41.383 に答える
1

実際にプリコンパイル済みヘッダー (PCH) を使用していない場合は、Visual Studio's Options/Preferences->Precompiled Headerそれらを無効にすることをお勧めします。それらを削除しようとしても Visual Studio を使用すると、大量のエラーが発生します。

于 2011-03-10T18:19:54.413 に答える