10

私は STL を使用する大規模なプロジェクトに取り組んでおり、 STL を編成するための望ましい方法について質問があります#includes

  • 使用されるソース ファイルに各ヘッダーを #include することを好みますか。たとえば、両方foo.cppbar.cpprequirestd::stringの場合、両方が になり#include <string>ます。
  • プロジェクトで使用するすべての STL ヘッダーを含む単一のヘッダー ファイルを使用したいですか (つまり、それらを MS 'stdafx.h' プリコンパイル済みヘッダーに追加します)。

最初の方法の利点は、.cpp ファイルが独立した単位であり、.cpp ファイルがないことを心配することなく別のプロジェクトで使用できることです#include。2 番目の方法の利点は、コンパイラのプリコンパイル済みヘッダー サポートを使用できることに加えて、一部の警告を無効にする STL をラップできることです#includes(pragmasたとえば、一部の Boost ヘッダーは、レベル 4 でコンパイルするときに警告を発生させます)。

どちらを使用するのが好きですか?

4

4 に答える 4

16

依存関係 (したがってコンパイル時間) を可能な限り低く保つために、すべてのソースに本当に必要なヘッダー ファイルのみを含め、「すべてをキャッチする」ヘッダーは含めません。

プリコンパイル済みヘッダーはこれに関係なく機能します (つまり、宣言を取得するためではなく、コンパイル プロセスを高速化するためにプリコンパイル済みヘッダーに依存しています)。したがって、インクルードされたプリコンパイル済みヘッダーを介して何かが宣言されたとしても、インクルード ガード メカニズムによってスキップされ、コンパイル時間に大きな影響を与えない「通常の」ヘッダーをインクルードします。

プリコンパイル済みヘッダーはコンパイラ固有のものです。私の意見では、プリコンパイル済みヘッダーを最適化/変更しても、コードの正しい機能には影響しません。

依存関係を可能な限り低くすることの主な利点は、リファクタリングが容易になる (というより、実現可能になる) ことです。

これらすべてに関する優れた本は、Lakos の Large Scale C++ Design です。

于 2008-11-12T10:07:46.890 に答える
2

私がしていることは、プロジェクト全体で必要になるすべての STL ヘッダーを、通常は既定の StdAfx.h である単一のプリコンパイル済みヘッダーに含めることです。プリコンパイル済みヘッダーは、すべての STL-/boost-/platform ヘッダーとサードパーティ ライブラリを含め、事実上、プロジェクトで最初に設定するものです。

STL と boost は名前空間にきちんと配置されているため、取り違えや重複が発生することはありません。

ヘッダーでは通常フル ネームを使用しますが、ソース ファイルでは必要に応じて名前空間 x を使用します

于 2008-11-12T10:44:15.147 に答える
2

これら 2 つの方法を組み合わせることができます。

両方の .cpp ファイルに を含め、それを stdafx.h に追加します。これでも PCH の最適化が行われます。

.cpp - ファイルはまだ "stdafx.h" を #include する必要があるため、その独立性には議論の余地があります。ただし、依存関係は明示的に状態であり、stdafx.h インクルードを削除することは、不足しているすべてのインクルードを見つけるよりも簡単です。また、標準ヘッダー (すべてのヘッダーがそうであるように) は、それらが 2 回含まれていないことを確認してください。


一般に、各ファイルを「独立」させるというあなたのアプローチに同意します。つまり、.cpp が別のプロジェクトに追加されるか、.h が含まれていると、その依存関係が処理されます。


PCH はトレードオフであり、巨大になる可能性があることに注意してください。ほとんど未使用のコードが PCH にあると、実際にビルドが遅くなる可能性があります。ただし、高速ディスクは大いに役立ちます:)

また、少なくとも一部のバージョンで MSVC でプリコンパイル済みヘッダーを有効にすると、実際には処理が変更されることに注意してください。 #include "stdafx.h" の前の宣言は無視されるため、これは最初の非コメント ステートメントである必要があります。醜い落とし穴。

于 2008-11-12T10:49:20.893 に答える
1

John Lakos の本 Large Scale C++ Design の提案に完全に同意します。

.h か .cpp かに関係なく、ファイルに必要なすべてのヘッダーをファイル自体で宣言します。他のヘッダー ファイルに含まれるファイルの副作用に依存しないでください。

すべてのインクルードをリストする大きなヘッダー ファイルがあると、依存関係が不必要に増加し、設計が非常に脆弱になります。

ああ、もう 1 つ、ヘッダー ファイルに using 宣言がありません。実装ファイル、.cpp ファイルでのみ使用してください。

HTH。

乾杯、

ロブ

于 2008-11-12T10:20:39.953 に答える