質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1255閲覧

hファイルにインクルードすることのデメリット

apa

総合スコア68

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/08/29 10:53

編集2021/08/29 11:07

hファイルで他クラス情報が欲しいときは前方宣言しておき
.cppファイルで#includeを行った方がよい
調べたところコンパイル時間が増えてしまうという認識であっていると思いますが
なぜか?と聞かれると答えることができません
ここについて理解がある方ぜひ教えていただきたいです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/08/29 10:55

どこでそれを聞いたんでしょうか
episteme

2021/08/29 10:55

> hファイルに#includeを記述するのはよくないと聞きます 誰がそんなこと言うてるんです? 出典はどこ?
otn

2021/08/29 11:02 編集

> hファイルに#includeを記述するのはよくない 間違っています。 もしかすると、何か限定された条件付きの話では?正しくなる条件が私には思いつきませんが。
apa

2021/08/29 11:07

文面がわかりにくかったため修正しました
episteme

2021/08/29 11:13 編集

前方宣言では解決しない場合も少なくありませんよ? たとえばコレ↓errorになるし。 class point; // 点の座標(forward-decl.) class circle { int radius; // 半径 point center; // 中心 ... };
HogeAnimalLover

2021/08/29 11:15

質問文がわかりづらいので、ソース例を提示すると良いと思いますよ。
退会済みユーザー

退会済みユーザー

2021/08/29 11:33

過去の質問も放置したままでまた丸投げ質問か
thkana

2021/08/29 11:35

> .cppファイルで#includeを行った方がよい > 調べたところコンパイル時間が増えてしまうという認識 ・.cppファイルでインクルードしたほうがなんらかのメリットがあって良いけれど、そうするとコンパイル時間が増えるという副作用がある ・.cppファイルでインクルードするとよい、その理由はそうしないとコンパイル時間が増えるから どちらを意図した文章ですか?
guest

回答2

0

ベストアンサー

おそらく,

class Y の定義が Y.h にあって…

//Y.h class Y { /*略*/ };

このYを使う class X とかいうのがあったときに…

C++

1//X.h 2 3class X 4{ 5private: 6 Y *m_pY; 7};

この X.h で

  • Y.h を include する
  • Y に関する前方宣言を書く

の比較についての話をしているのかな…? と想像する.

で,

コンパイル時間が増えてしまう

というのは,
前者側(X.h で Y.h をincludeする場合)にすると,X.hをincludeする側にY.hへの依存関係が生まれるから,Y.hに変更があったときに X.hをincludeする箇所全てが再コンパイル対象になって…
みたいな話について言っているのかな?

そういう話の場合,どちらの形をとるか(:includeするか前方宣言にするか)は,「X.h利用側が再コンパイル対象になること」が妥当か否かで判断すればよい.
X.h をincludeして class X を使う側が「必ず/まず間違いなく」class Y の定義を必要とするなら,前者側,そうでないなら後者側 にしとけばよかろう.
(もちろん,Xが,Yの前方宣言では済ませられない形ならそもそも選択肢はない)

投稿2021/08/30 01:45

fana

総合スコア11954

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apa

2021/09/05 04:53 編集

返信ありがとうございます h内での依存関係がコンパイル時間の増加につながるみたいですね
guest

0

調べたところコンパイル時間が増えてしまうという認識であっていると思いますが
なぜか?と聞かれると答えることができません

「入れ子の#includeはコンパイル時間を食う」のはなぜか ですか?

#includeはその場にヘッダのナカミを書き下すんだから、
それだけ字句解析と構文解析に要する時間は増加します。

投稿2021/08/29 11:20

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問