No.2ベストアンサー
- 回答日時:
どちらの方法でも同じですね。
でも利点で考えれば下のようになると思います。前者はソースファイル上にincludeしているヘッダファイルの一覧が見えて
どのヘッダファイルを参照しているか一目瞭然になります。
後者はヘッダファイルのパッケージ化(カプセル化?)を行うことになるので、
ある関数を使うときはこれさえあればいいといった感じになります。
どちらを選択するかは作り手の好みの問題じゃないでしょうか。
私なら…
ソース上にincludeがたくさん並んでも煩雑になるような気がするので
後者が好きかなあ。
ご回答有り難うございます。
私も基本は後者なのですが、古参の方は前者が多い気がします。
好みの問題なのですかね。
私もソースを流用する点においては後者だと思います。
>前者はソースファイル上にincludeしている
>ッダファイルを参照しているか一目瞭然になります。
なるほど。納得しました。
No.8
- 回答日時:
複数の人たちでひとつのプログラムを作るような場合には、ひとつに機能に対して公開ヘッダを一つ作ることが多いですよね。
その公開ヘッダには、必要なヘッダファイルがすべてインクルードしてあって、それだけインクルードすればその使いたい機能を使うことができるわけです。
ただ、そこで必要のないヘッダファイルまでインクルードしないようにしましょう。
そういう意味じゃ、なんでもかんでもインクルードすれば良いというわけじゃなくて「必要最小限」である必要があります。
というわけで、私は後者派ですね。
前者のほうは…すみません、使用しないのでメリットがいまいちよくわかりません。
No.6
- 回答日時:
No.4です。
--- a.h ---
class B;
class A
{
int funcA(B* pB);
:
}
こう定義しておいて、funcAを使う必要がある場合だけ
ソースから b.h をインクルードするようにすれば
a.h が先だろうと b.h が先だろうと関係なるので
極力インクルード順に依存しないように定義して
必要なヘッダをソースからインクルードした方が
良いと言いたかったのですが、
質問の読み返してみると、質問の意図と
全然違いましたね。 (^_^)
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)
なら必要ですよね。
No.5
- 回答日時:
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);
:
}
---
とするかの選択になると思う。
この事例なら前者にする奴はまずいないと思うけど。
No.4
- 回答日時:
私はモジュール間の依存関係を抑える為に、前者を使いますよ。
依存関係が密になると、コンパイルすらできなくなりますから。
下記の場合でも、インクルードせずに前方参照にしておけば
問題ありません。
--- 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);
:
}
No.3
- 回答日時:
基本的に昔のやり方だと思いますよ、ヘッダを並べるのは。
昔は、二重インクルード防止策も一般的じゃなかったし、一回コンパイラを走らせると1時間なんてこともあったのでちょっとの効率差も大事だし、依存関係も自動抽出できなかったのでヘッダを並べた方が分かりやすかったんでしょう。
今では入れ子インクルードを忌避する理由のは、二重インクルード防止策がない古いヘッダを読み込むとトラブることくらいかと。
No.1
- 回答日時:
ヘッダからヘッダをインクルードする方がプログラムを読む方には分かりやすいですし、新規にプログラムファイルを追加する場合にもインクルードするファイルと順序を気にする必要性がなく楽ですね。
ただしヘッダからヘッダをインクルードする場合、ヘッダファイルで二重インクルードを防止する対策を取っていないとエラーが出やすくなります。また二重インクルード対策を取っていてもインクルードするファイルが増えるのでコンパイルが遅くなります。
ちなみに自分は、ヘッダからヘッダをインクルードする方針で全体を統一しておく方針で書きます。
ご回答有り難うございます。
前者を使う人もいるので前者に何かメリットが
あるのかなと思った次第です。
1.E-10秒ぐらいはコンパイルが早くなるって感じでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript JSON について 1 2022/06/09 18:17
- その他(パソコン・スマホ・電化製品) ワードでテキストボックス内の文字を連動させない方法 2 2023/02/09 16:56
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- UNIX・Linux テキストファイルをページ番号付きでコマンドラインから印刷したい 1 2023/02/22 12:47
- その他(コンピューター・テクノロジー) 「プロトコル」の定義について 5 2023/04/16 13:13
- PHP 掲示板のセキュリティについてアドバイスお願い致します 1 2023/08/11 20:44
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- C言語・C++・C# メインプログラムに#include <algorithm>を書いて、 そのメインプログラムが // 3 2023/05/02 11:24
- C言語・C++・C# win10で、正確な待ち時間の作り方 6 2023/02/14 18:28
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
#include <Windows.h>というヘッダファイルについて
C言語・C++・C#
-
C++ 構造体の一括初期化 {0}
C言語・C++・C#
-
fgetsなどのときのstdinのバッファを消すには?
C言語・C++・C#
-
-
4
C言語での引数の省略方法
C言語・C++・C#
-
5
char*を初期化したいのですが
C言語・C++・C#
-
6
関数から配列を返すには?
C言語・C++・C#
-
7
構造体のメンバをfor文で回したい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
HTTP 200 OKの後のリダイレクト?
-
perlでHTTP Request Headersの...
-
VBAでExcelのヘッダーに文字列+...
-
WWWサーバーソフトを確認するには
-
MTUについて(Ethernetヘッダ)
-
LWP でリクエストヘッダを変更
-
[C#]ListView一覧表示時の幅設...
-
ヘッダのinclude順
-
HTTPヘッダの大きさ
-
ルータでのMTU、MSS設定値の検...
-
エクセルで 自動的に◯や数字を...
-
ファイルをディレクトリ分配の...
-
DBを10件毎に表示ページング...
-
毎○曜日って、使いますか?
-
[Excel] ある日の曜日が当月の"...
-
曜日を求めるプログラムはどう...
-
月の第一週とは
-
週2回のペースって だいたい何...
-
cgiとplとpm
-
raspberrypiから外部サーバーへ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでExcelのヘッダーに文字列+...
-
[C#]ListView一覧表示時の幅設...
-
リストコントロールの列幅を固...
-
ヘッダのinclude順
-
AccessVBAで「このフィールドに...
-
HTTPヘッダの大きさ
-
LinuxでRTPヘッダを作りたいの...
-
バイナリファイルのアップロー...
-
Content-type: text/htmlが表示...
-
SpreadDesignerの列ヘッダ
-
file_get_contents でリダイレ...
-
TCPヘッダのチェックサム算出方法
-
あれれ、クッキーが機能しませ...
-
関数ヘッダ?
-
SSL環境でオートコンプリートを
-
ログイン後・・・
-
メールをPDF化する際に、ヘッダ...
-
perlでHTTP Request Headersの...
-
cookieを表示させたい。(ブラウ...
-
LWPでHTTPSサイトからコンテン...
おすすめ情報