2016-08-21 2 views
1

私はfoo.hというヘッダファイルを持っていて、別のヘッダ、bar.hを含んでいるとします。C++、もし私がそれを必要とすれば#includeすべきか?

xyz.hというヘッダーファイルもあります。 foo.hbar.hを含み、...だから

foo.hbar.hがお互いに何の関係もないが、それは、foo.hbar.h必要ですので、私は奇妙にだけは(それがbar.h含まれているので、まだコンパイルされfoo.hが含ま感じるだろう、 bar.hfoo.hが含まれていませんが、xyz.hfoo.hbar.h含まれない。この悪い習慣ですか?私はいけない理由は、何らかの理由?なぜ私はこれを行うことができるAMはありますか?

+2

これは一般的な方法です。ヘッダーには他にどのようなヘッダーファイルが含まれているかわからないので、必要なものをすべて含めます。 [#include guards](https://en.wikipedia.org/wiki/Include_guard)は、同じヘッダーが2回含まれていると問題を防ぎます。 – Barmar

+3

すべてのヘッダーファイルには、別のヘッダーに付随する可能性があるため無視する必要があるヘッダーがすべて*すべて*含まれている必要があります。 – Galik

+0

検索エンジンを使用して「使用するものを含める」を検索します。それはhttp://include-what-you-use.org/とhttps://github.com/include-what-you-use/include-what-you-useと他の参考文献を提出しなければなりません。 –

答えて

2

各ヘッダーは自己完結型である必要があります。それには、必要な他のすべてのヘッダーが含まれ、include guardsが含まれている必要があります。

ヘッダが自己完結型ではないとします。次に、別のクライアントでそのヘッダーを使用したい場合は、必要なヘッダーが見つからない限り、新しいクライアントはコンパイルされません。

また、ヘッダーファイルが自己完結型でない場合もあります。詳細はGoogle's code styleをチェックしてください。

ほとんどのコンパイラは、インクルード依存関係調査のオプションをサポートしています。これらのオプションおよびその他のツールについては、questionで説明しています。

+0

あなたが最初の段落で言うことは真実です - それはしばしば「自己完結型」と呼ばれます。しかし、この質問では、複数のヘッダーが含まれている場合、「自己完結型」とは何を意味していますか?問題はヘッダーA.hに別のヘッダーB.hが含まれ、C.hが含まれ、C.hがA.hが使用するものを定義するために、ヘッダーA.hが自己完結型である可能性があるということです。 BhがChを必要としている間、Ahはそれが機能するという意味で自己完結していますが、BhがChを必要としないように変更してもAhはChを必要とするならば、Bhは変更された。 –

+0

@JonathanLefflerもし 'A.h'が' C.h'で定義されたものを使用しているのではなく、 'C.h'が含まれていなければなりません。私はそれを「自己完結型」ヘッダーと理解しています。 – Nikita

+1

私は理解しています。同意する。しかし、B.hにはまだC.hが含まれていますが、A.hは適切に自己完結していないことをどのように示していますか? Cプログラマーの見解については、[ヘッダーに '#includeを使うべきですか?](http://stackoverflow.com/questions/1804486)と、自己封じ込めを保証するためのかなり効果的な方法があります。しかし、「かなり効果的な方法」は、上記で概説したA.h、B.h、C.hのシナリオに対して脆弱であり、それを回避するための些細な方法はありません。 http://Include-What-You-Use.org/などを参照してください。 –

関連する問題