1

私は個人的なプロジェクトを持っていますが、ヘッダー/cpp ファイルのペアが 20 を超えるとは思えません。各ヘッダーとcppファイルに必要な他のファイルを含める(または前方宣言を使用する)方が良いのか、それともすべてのファイルに「Includes.hpp」を含めて標準ライブラリをすべて含める方が良いのか疑問に思っていました。各クラスの前方宣言を行い、他のすべてのヘッダーを含めます。

ご覧のとおり、1 つの大きなヘッダー ファイルを使用すると、次のようになります。

  • すべてをクリーンアップ
  • 他のディレクトリからこれらのファイルを簡単に含めることができます (1 つのファイルを使用するためにナビゲートするだけで、他のすべてのファイルがリンクされるため)
  • コンパイルごとにすべてのファイルが含まれますが、これは小さなプロジェクトであることを考えると、すべてのファイルを使用するため、不利ではありません。

これは良い考えですか?

4

3 に答える 3

5

一般的に、これはいくつかの理由で悪い考えだと思います。

  • カプセル化が不十分になります。クライアントは必要なヘッダーをプルするだけで済みます。このアプローチでは、インクルージョンによってすべてが引き込まれ、Alokが言及しているように、ビルド時間と再構築に対する感度が向上します。
  • インターフェイスクラスと実装クラスの間に違いはありません。つまり、ライブラリのクライアントが使用するクラスと、このライブラリによって内部的に使用される、クライアントが見る必要のない(おそらく見るべきではない)クラスです。
  • ヘッダーのいずれかがマクロを定義している場合、これらはヘッダーを含む他のコードに「リーク」する可能性があり、これは望ましくない可能性があります。入力しなければならなかったことのある人なら誰でも#undef MIN、この痛みを知っているでしょう。
  • 相互に認識しなければならないクラスが複数ある場合は、再帰的な包含の可能性があるため、包含の順序に敏感であるか、包含サイクルが発生する可能性があります。

受け入れられる場合もあると思います。それは、ライブラリがクライアントによって呼び出されることを目的としたいくつかのクラス/関数のみを提供し、残りはすべて実装で使用される内部クラスである場合です。したがって、クライアントは含めることができ、それだけmylib.hを心配する必要があります。これにより、ライブラリと1つのヘッダーを配布するだけでよいため、ライブラリを静的ライブラリとしてコンパイルする場合にも簡単になります。

于 2013-01-02T09:56:41.960 に答える
3

正直なところ、私はそれをしません。あなたのプロジェクトには約 20 個の cpp ファイルしかないとおっしゃいましたが、これらのファイルがどれだけ大きくなり、どれだけ複雑なコードが含まれるかについては言及されていませんでした。すべてを 1 つの大きなヘッダーに入れると、そのたびに 20 個のファイルを再コンパイルする必要があり、それらのファイルに多くのコードが含まれていると、コンパイル時間が大幅に増加します。

もちろん、大きなヘッダーに含めたいのが標準ライブラリのヘッダーまたは変更しないヘッダーだけである場合は、それらすべてをプリコンパイル済みヘッダーに入れて、すべての cpp ファイルに含めることができます。

ただし、変更するヘッダーがある場合 (クラス定義の変更、typedef の追加など)、変更ごとにすべての cpp ファイルを再コンパイルする必要があることに注意してください。これらのファイルのサイズによっては、小さな編集 (関数名の変更、空白の追加、コメントの追加) ごとに、5 秒かかるところが 1 分遅れる可能性があります (さらに、次のようなより複雑なライブラリを使用している場合)。 Boost.Spirit、それらの時間は本当に速く上がります)。

結論として、維持する必要があるプロジェクトに取り組んでいる場合、プロジェクトが現在小規模であっても、すべてを 1 つのファイルにまとめることはしません。

于 2013-01-02T09:40:19.990 に答える
0

あまり。

コンビニエンスヘッダーの使用は確かに存在します。これらを使用して、一緒に機能をパッケージ化することができます。またinclude、90% の時間のクライアントがとにかく、ヘッダーには、含まれるオブジェクトの完全な定義も必要です。

ただし、グローバル ヘッダーは不適切なスタイルであり、現在はプロジェクトが小さくても、後で大きくなる可能性があります。この種のものを解明し、ヘッダーを再分割する必要があったので、私は次のようにしか言えません:面白くない...

とにかく利益は何ですか?プロジェクトが小さい場合は、最初からヘッダーがほとんどないため、限界があります。

于 2013-01-02T09:37:32.353 に答える