ページ 11

ヘッダファイル内で他のヘッダファイルをインクルードする理由

Posted: 2014年8月22日(金) 20:27
by エンジ
ヘッダファイルは、Cファイル間のインターフェースの役割だと思っています。
したがって、公開する関数、構造体定義、define定義などを書きます。
(ヘッダファイル+Cファイルをクラス(モジュール)と考えるなら、パブリックな関数や変数を書きます)

ヘッダファイルのインクルードは、
できるだけ、使用元になるCファイル内で行うことが望ましいと思います。

なぜなら、
ヘッダファイル内で他のヘッダファイルをインクルードすることは、
循環インクルードのリスクもありますし、ファイル間の依存関係を強めるからです。

では、
ヘッダファイル内で他のヘッダファイルをインクルードする理由はなんでしょうか?
主に以下の2つのようなことでしょうか??
1.下位モジュールの定義を、新たな定義に組み込みたい
  例えば、下位モジュールで定義した構造体を、新たに定義する構造体のメンバに組み込む
2.下位モジュールで定義した構造体を引数にした関数を公開したい。
  例えば、上位-中位-下位というモジュール構造があり、下位モジュールで定義した構造体変数を
  上位→中位→下位の順に渡したい場合、中位モジュールの公開する関数の引数にすることになる。

言葉ではわかりにくいかもしれませんが、よろしくお願いします。

Re: ヘッダファイル内で他のヘッダファイルをインクルードする理由

Posted: 2014年8月23日(土) 10:36
by プラム
例えばこういう事ですか?

main.h

コード:

#include "main2.h"

main2.h

コード:

#include "main3.h

#define A 1 //適当です

main3.h

コード:

#include "main2.h"

#define B 2 //これも適当です

よくわからなかったので
違ったらごめんなさい
こういう事であるのであれば理由を書きます

Re: ヘッダファイル内で他のヘッダファイルをインクルードする理由

Posted: 2014年8月25日(月) 20:29
by エンジ
そういうことです。

#include "Haruln.h"を一つインクルードすれば良いようになっていますが、
結局3つのヘッダーファイルをインクルードしているのと同じです。

コードが1行になった代わりに、依存関係が見えにくくなっています。
モジュールを分割する意味がわかりません。

Re: ヘッダファイル内で他のヘッダファイルをインクルードする理由

Posted: 2014年8月25日(月) 21:05
by softya(ソフト屋)
その様にインクルードする必然性はありませんが#defineや構造体やenumの定義の依存関係からヘッダ先頭にインクルードせざる終えない時はあります。
それでも出来るだけ分かりやすくなるようにしないと修正時に自滅することが多いですね。
C言語の仕様から来る問題ですので、コーディング規約で出来るだけ避けるしかありません。

Re: ヘッダファイル内で他のヘッダファイルをインクルードする理由

Posted: 2014年8月26日(火) 09:46
by usao
>ヘッダファイル内で他のヘッダファイルをインクルードする理由はなんでしょうか?

利便性 という理由もあるでしょう.

例えば OpenCV には OpenCV.hpp というヘッダがありますが,
その中身は 単にたくさんのモジュールのためのヘッダファイルをincludeしているだけ.

もちろん使うモジュールのヘッダ群だけをを選択的にincludeすればよいのですが,
じゃあ自分が使いたい機能に対応するヘッダはどれとどれなのよ?ムキーッ! とかいう場合用(?)なのかな,と.