dポイントプレゼントキャンペーン実施中!

ヘッダにヘッダをincludeせず
include順でカバーする場合と、
必要なヘッダはヘッダにincludeする
という方法があると思いますが
この違いはなんでしょうか?

上記の方法でも結局ヘッダの変更で影響のあるcppファイルは
コンパイルする必要があるのでどちらも同じ気がするのですが
何か違い、あるいは推奨する理由はありますか?

A 回答 (8件)

どちらの方法でも同じですね。

でも利点で考えれば下のようになると思います。
前者はソースファイル上にincludeしているヘッダファイルの一覧が見えて
どのヘッダファイルを参照しているか一目瞭然になります。
後者はヘッダファイルのパッケージ化(カプセル化?)を行うことになるので、
ある関数を使うときはこれさえあればいいといった感じになります。
どちらを選択するかは作り手の好みの問題じゃないでしょうか。

私なら…
ソース上にincludeがたくさん並んでも煩雑になるような気がするので
後者が好きかなあ。
    • good
    • 0
この回答へのお礼

ご回答有り難うございます。
私も基本は後者なのですが、古参の方は前者が多い気がします。
好みの問題なのですかね。
私もソースを流用する点においては後者だと思います。

>前者はソースファイル上にincludeしている
>ッダファイルを参照しているか一目瞭然になります。

なるほど。納得しました。

お礼日時:2005/09/02 17:37

複数の人たちでひとつのプログラムを作るような場合には、ひとつに機能に対して公開ヘッダを一つ作ることが多いですよね。


その公開ヘッダには、必要なヘッダファイルがすべてインクルードしてあって、それだけインクルードすればその使いたい機能を使うことができるわけです。

ただ、そこで必要のないヘッダファイルまでインクルードしないようにしましょう。
そういう意味じゃ、なんでもかんでもインクルードすれば良いというわけじゃなくて「必要最小限」である必要があります。

というわけで、私は後者派ですね。

前者のほうは…すみません、使用しないのでメリットがいまいちよくわかりません。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。

お礼日時:2005/09/04 23:00

絶対にヘッダファイルをインクルードする必要がある依存関係としては、継承があります。

こればっかりはどうしようもない。あとはメンバで(ポインタでなく)実体を宣言している場合。
他は何があったかな。
    • good
    • 0
この回答へのお礼

何度も回答いただき有難うございます。
大変参考になりました。

お礼日時:2005/09/04 23:00

No.4です。



--- a.h ---
class B;
class A
{
int funcA(B* pB);
:
}

こう定義しておいて、funcAを使う必要がある場合だけ
ソースから b.h をインクルードするようにすれば
a.h が先だろうと b.h が先だろうと関係なるので
極力インクルード順に依存しないように定義して
必要なヘッダをソースからインクルードした方が
良いと言いたかったのですが、
質問の読み返してみると、質問の意図と
全然違いましたね。 (^_^)
    • good
    • 0
この回答へのお礼

yasuchさん、rinkunさん
ご回答有り難うございます。
ヘッダにヘッダが必要な状況というのは
class A
{
int funcA(B* pB){ pB->funcB(); }

};
って感じでヘッダにfuncAの定義も書いちゃうとb.hが必要ですね。
でも個人的にこの場合はあまりa.hにb.hはincludeしたくないので
(コンパイルの影響範囲がでかくなるため)
a.cppに書いてb.hをincludeするかも。
(ただinline展開されないだろうから、オーバーヘッドはでかくなる?)
あとa.hにb.hが必要なのってBのサイズを知る必要がある場合でしょうか。
int funcA(B *pB)では無く int funcA(B b)
なら必要ですよね。

お礼日時:2005/09/03 10:56

No.4さんの例は不適当だと思うな。

これはそもそもインクルードする必要がない例だからインクルード順に配慮する必要ないし。

元の質問と対応づけるなら、
--- a.h ---
class A
{
int funcA(B* pB);
:
}
---
として.cxxファイルでa.hを読み込む前に前方参照(またはb.hのインクルード)をするか、
--- a.h ---
class B;
class A
{
int funcA(B* pB);
:
}
---
とするかの選択になると思う。
この事例なら前者にする奴はまずいないと思うけど。
    • good
    • 0

私はモジュール間の依存関係を抑える為に、前者を使いますよ。


依存関係が密になると、コンパイルすらできなくなりますから。
下記の場合でも、インクルードせずに前方参照にしておけば
問題ありません。

--- a.h ---
#include "b.h"
class A
{
int funcA(B* pB);
:
}

--- b.h ---
#include "c.h"
class B
{
public:
int funcB(C* pC);
:
}

--- c.h ---
#include "a.h"
class C
{
public:
int funcC(A* pA);
:
}
    • good
    • 0

基本的に昔のやり方だと思いますよ、ヘッダを並べるのは。


昔は、二重インクルード防止策も一般的じゃなかったし、一回コンパイラを走らせると1時間なんてこともあったのでちょっとの効率差も大事だし、依存関係も自動抽出できなかったのでヘッダを並べた方が分かりやすかったんでしょう。
今では入れ子インクルードを忌避する理由のは、二重インクルード防止策がない古いヘッダを読み込むとトラブることくらいかと。
    • good
    • 0

ヘッダからヘッダをインクルードする方がプログラムを読む方には分かりやすいですし、新規にプログラムファイルを追加する場合にもインクルードするファイルと順序を気にする必要性がなく楽ですね。


ただしヘッダからヘッダをインクルードする場合、ヘッダファイルで二重インクルードを防止する対策を取っていないとエラーが出やすくなります。また二重インクルード対策を取っていてもインクルードするファイルが増えるのでコンパイルが遅くなります。

ちなみに自分は、ヘッダからヘッダをインクルードする方針で全体を統一しておく方針で書きます。
    • good
    • 1
この回答へのお礼

ご回答有り難うございます。
前者を使う人もいるので前者に何かメリットが
あるのかなと思った次第です。
1.E-10秒ぐらいはコンパイルが早くなるって感じでしょうか。

お礼日時:2005/09/02 17:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!