2013-03-27 17 views
9

私はかなりのプロジェクト(しばしばゲームエンジン)を見てきましたが、すべてのヘッダーが1つのヘッダーファイルに置かれます。マスターインクルードファイル - 良いか悪い練習

// Master.h 

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

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

他のプロジェクトは、ソースファイルに必要なヘッダーのみを含める必要があるという根拠に基づいて動作します。

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

+1

1つは、ベストプラクティス、もう1つは怠惰な練習です。 :D –

+1

lazyメソッドを使う以外にも、新しいユーザーは、クラス/メソッド/ etcの場所を知らなくても簡単にライブラリを使用することができます。しかし、(imho)の大きな欠点は、コンパイル時の負の影響です。 – stefan

+0

これまでのところ、マスターインクルードは遅延メソッドですが、新しいユーザーという利点があります。 他の方法がベストプラクティスであり、パフォーマンス上の利点があることを意味しますか? – Zammalad

答えて

7

ほとんどの答えは、コンパイル時に言及しており、ヘッダーのプリコンパイルには膨大なコンパイル時間の利点があり、マスターヘッダー技法でははるかに優れています。

マスターヘッダーファイルなしで直接インクルードすると、ヘッダーが機能するようにするのが好ましい(テストが容易になる)。現代のコンパイラは、「乗算された場合にヘッダファイルをスキップする」ロジックを最適化しています。

+0

これはもう一つの大きな答えです。私は、Xcodeでの開発に移ったばかりなので、プリコンパイルされたヘッダーについて多くのことを知らないことは認めなければなりません。すべてがVisual Studioですべてをやっていました。 – Zammalad

+0

@ Zammalad:Visual Studioの "新規プロジェクト"ウィザードは、マスターヘッダーメソッドを使用します。彼らはそれを 'stdafx.h 'と呼びます。 –

2

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

原則として、ソースファイルにできるだけ少ないヘッダーを含める必要があります。 しかし、これは便利な場合があります。サードパーティのライブラリが頻繁に変わることはありません。

+0

コンパイルされたヘッダーを使用できるようになり、再構築の機会を最小限に抑えることができるため、大部分のコンパイル単位で必要なヘッダーにも役立ちます。 –

+0

これは決して使用されていませんが、その場合のポイントがあるようです – mirlitone

2

C++のコンパイルは高価で、特に遅くなる可能性があるので、ヘッダーファイルがたくさんある場合(またはヘッダーを含む多くの実装ファイルがある場合)、未使用のヘッダーを不必要にインクルードするのを避けることによって、処理時間と解析時間を短縮できます。

これはライブラリの実装用です(ゲームエンジンを参照すると、私たちはここでライブラリについて話していると思います)。これで、ライブラリを使用している人と、すべてを1か所で(そして同時に何千ものファイルを持たない)必要とするものを含めることになるので、「マスター」インクルードファイルを間違いなく作成できます。

+0

優れています。私の最初の質問は私が望んでいたほど明確ではありませんでしたが、あなたは頭の爪に当たっていました。私があなたを正しく理解していれば、図書館の発展に必要なものだけを含めるようにしてください。次に、ライブラリを使用するための単一のマスターインクルードファイルを作成できます。 – Zammalad

+0

@ Zammalad ...ライブラリのユーザーがたくさんのファイルを持っていない場合(パターンにすることができます - ライブラリーを使用する方が書いたほうが短くて短くなります) –

+0

ええ、私はあなたです。ユーザーコードが大規模で多くのファイルをカバーしていた場合、そのコードは生産性が低下することがわかります。バランスの取れた行為のビット。 – Zammalad

0

私の意見では、右のヘッダーファイルの名前を入力しないことで5秒を得ることは、このメソッドによって引き起こされるコンパイル時間の潜在的な莫大な増加にはあまり価値がないと確信しています。

これは悪い言い方です。

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

+1

5秒は、ソースファイルのすべての依存関係のリストを正確に書き込んで維持するのに要する時間に対して、非常に楽観的です。 –

+0

通常、1000行のソースファイルではなく、コーディング中に必要なものを含めます。その場合、はい、それはあなたに5秒以上かかるでしょうが、なぜあなたはそのような立場にいますか? – cmc

+0

あなたはどのポジションにいても、仕事をしなければなりません。 5秒間に数回(インクルードごとに1回)かかる場合、それは5秒以上です。重要ではない部分は、ファイルからコードを削除してメンテナンス中であり、依存関係を削除してインクルードを取り出せるかどうかを判断します。この作品は一般的には価値がありますが、作品がまったくないと思われるのは、IMOを正当化する方法ではありません。 –

1

ライブラリにマスターが提供されている場合は、必要なヘッダーだけを含めて追加することもできます。このようなヘッダーには必要なものはすべて含まれていませんが、むしろマスターヘッダーには必要なすべてのヘッダーが含まれるという事実に依存しています。したがって、あなたが図書館のユーザーであれば、通常は選択肢が多くなく、著者の提案する方法に従うべきです。

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

0

私はいくつかは、C++での質問だと思います - そしてまた、この1 - あなたが使用していないもののために払っていないC++「マントラ」

を覚えることによって自分自身に答えることができます。

可能な限り、ユーザー(つまり、コード/ライブラリのコンシューマー)の計算コスト(実行時間とコンパイル時間)を節約します。名前空間を汚染したり、コンパイラで必要以上に多くのものを投げたりしないでください。私はそれがC + +の丁寧な方法だと思う:)

関連する問題