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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
エンジ
記事: 2
登録日時: 11年前

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

#1

投稿記事 by エンジ » 11年前

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

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

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

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

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

アバター
プラム
記事: 164
登録日時: 11年前
住所: 東海地方

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

#2

投稿記事 by プラム » 11年前

例えばこういう事ですか?

main.h

コード:

#include "main2.h"

main2.h

コード:

#include "main3.h

#define A 1 //適当です

main3.h

コード:

#include "main2.h"

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

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

エンジ
記事: 2
登録日時: 11年前

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

#3

投稿記事 by エンジ » 11年前

そういうことです。

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 11年前

その様にインクルードする必然性はありませんが#defineや構造体やenumの定義の依存関係からヘッダ先頭にインクルードせざる終えない時はあります。
それでも出来るだけ分かりやすくなるようにしないと修正時に自滅することが多いですね。
C言語の仕様から来る問題ですので、コーディング規約で出来るだけ避けるしかありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

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

#5

投稿記事 by usao » 11年前

>ヘッダファイル内で他のヘッダファイルをインクルードする理由はなんでしょうか?

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

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る