インクルード

アバター
ナムアニクラウド
記事: 16
登録日時: 15年前
住所: 茨城県

インクルード

投稿記事 by ナムアニクラウド » 15年前

 インクルードしたヘッダファイルを再びインクルードするのは無意味ですが、次の場合はどうでしょう。

main.h

CODE:

#include 
	/*	何かiostreamを使った実装がある	*/
main.cpp

CODE:

#include 
#include "main.h"

int main()
{
	/*	何か"main.h"の実装を使う	*/
	std::cout 
#include 
	/*	何かiostreamを使った実装がある	*/

int main()
{
	/*	何か"main.h"の実装を使う	*/
	std::cout << "Hello";
	return 0;
}
となります。

 2回目のインクルードは無意味になりますが、ヘッダファイルでインクルードしてあるからといって、その機能を使うソースファイルで明示的にインクルードしないのはいかがなものか?
と、長い間疑問に思いつつも、とりあえず明示的に書いておこう、と今までやってきたわけです。

 みなさんはどう思われますか?よろしければご意見お願いします。
最後に編集したユーザー ナムアニクラウド on 2010年10月23日(土) 19:52 [ 編集 1 回目 ]

アバター
a5ua
記事: 199
登録日時: 15年前

Re: インクルード

投稿記事 by a5ua » 15年前

通常、ヘッダファイルには2重インクルード防止にインクルードガードを書きますが、
ヘッダファイル中で、さらに#includeをする場合に、
「そのファイルが既にインクルードされていたら、#include自体を行わない」
という冗長インクルードガードというものがあるそうです。

参考
http://99blues.dyndns.org/blog/2010/06/ ... e_build_2/

ソースファイル(.cpp)中では、必要なものは明示的にインクルードするという方針でいいのだと思います。

アバター
ナムアニクラウド
記事: 16
登録日時: 15年前
住所: 茨城県

Re: インクルード

投稿記事 by ナムアニクラウド » 15年前

>a5uaさん
 ご意見ありがとうございます!

 リンク先のページは非常に参考になりました。
ヘッダファイルでのインクルードはコンパイル時間に影響をおよぼすことがあるんですね。
二重インクルードガードを設けていてもファイルの最後までパースされ、その分の時間はかかってしまう。
そのため、インクルード自体を防止する「冗長インクルードガード」がある、というわけですね。

 最近は #pragma once を使っていましたが、冗長インクルードガードを用いるとすると#ifndef~#endifを使ったほうがいいですね・・・