9

私はかなりの数のプロジェクト (多くの場合、ゲーム エンジン) を見てきました。このプロジェクトでは、すべてのヘッダー インクルードが単一のヘッダー ファイルに配置され、マクロなども含まれることがあります。

// Master.h

#include "header1.h"
#include "header2.h"
#include "header3.h"
.
.
#include "headerN.h"

コードを使用する場合、標準は Master.h ファイルのみを含めることです。

他のプロジェクトでは、ソース ファイルには必要なヘッダーのみを含める必要があります。

私が知りたいのは、ベスト プラクティスに関する決定的な答えがあるかどうか、できれば測定可能な結果があるか、それとも個人的な好みでしょうか?

4

6 に答える 6

7

ほとんどの回答はコンパイル時間に言及しており、ヘッダーのプリコンパイルにはコンパイル時間の大きな利点があり、マスターヘッダー手法ではるかにうまく機能するという事実を無視しています。

できれば、マスター ヘッダー ファイルなしで直接インクルードした場合、ヘッダーが機能するはずです (これにより、テストが容易になります)。最新のコンパイラは、「複数含まれている場合はヘッダー ファイルをスキップする」ロジックを最適化しています。

于 2013-03-27T16:51:09.110 に答える
2

ファイルが変更されたり、含まれているヘッダーのいずれかに触れたりするたびに、プロジェクトを最初から再コンパイルする必要があるため、コンパイル時間の観点からは間違いなく悪い習慣です。

経験則として、ソース ファイルに含めるヘッダーはできるだけ少なくする必要があります。ただし、あまり頻繁に変更されないサードパーティのライブラリで、これが役立つ状況がいくつか見られます

于 2013-03-27T16:47:49.987 に答える
2

C++ のコンパイルはコストがかかり、特に時間がかかる可能性があるため、ヘッダー ファイルが多数ある (または実装ファイルが多数ある) 場合は、未使用のヘッダーを不要に含めることを避けることで、余分な前処理と解析時間を回避できると思います。これにはヘッダーが含まれます)。

それはライブラリの実装のためです (あなたがゲーム エンジンについて言及していると、ここでライブラリについて話しているように思えます)。これで、ライブラリを使用し、すべてを 1 か所にまとめたい (同時に何千ものファイルを持たない) 人を含める便利な「マスター」インクルード ファイルを確実に作成できます。

于 2013-03-27T16:47:57.717 に答える
1

また、ライブラリがマスター ヘッダーを提供する場合に必要なヘッダーのみを含めるのは、かなり悪い考えだと付け加えます。そのようなヘッダーに必要なすべてが含まれていないことがよくありますが、マスターヘッダーに必要なすべてのヘッダーが以前に含まれているという事実に依存しています。そのため、ライブラリのユーザーである場合、通常はあまり選択肢がなく、作成者が提案する方法に従う必要があります。

これが、マスターヘッダーを持つことが悪い習慣と見なされる理由でもあります.上記のようなケースを検出するのが難しくなります.

于 2013-03-27T17:18:44.510 に答える
0

私の意見では、正しいヘッダー ファイルの名前を入力しないことで得られる 5 秒は、この方法によって引き起こされる潜在的に膨大なコンパイル時間の増加に値するものではありません。

これは悪い習慣だと思います。

ただし、H2CO3 が言ったように、フレームワークのエンド ユーザーにマスター ヘッダー ファイルを使用する可能性を提供することは非常に役立ちます。私がよく覚えていれば、GTKはそれを行います。

于 2013-03-27T16:48:38.943 に答える
0

C++ でのいくつかの質問 (およびこれも) は、C++ の「マントラ」を思い出すことで自分で答えることができると思います。

使わないものにお金はかかりません。

ユーザー (つまり、コード/ライブラリの消費者) の計算コスト (実行時とコンパイル時) を可能な限り節約します。名前空間を汚染したり、必要以上のものをコンパイラ (シンタックス ハイライターなどでも) にスローしたりしないでください。私はそれがC ++の礼儀正しい方法だと思います:)

于 2013-03-27T18:26:13.033 に答える