namazu-dev(ring)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

avoiding include files nesting



入れ子の include file を廃止しました。

今までは namazu.h の中で libnamazu.h を読み込んで、 
libnamazu.h の中で magic.h を読み込んだりと、たいへん入り組
んでいました。

参考: Notes on Programming in C by Rob Pike より

| Include files
| 
|      Simple rule: include files should never include include
| files.   If  instead  they state (in comments or implicitly)
| what files they need to have included first, the problem  of
| deciding  which files to include is pushed to the user (pro-
| grammer) but in a way that's easy to  handle  and  that,  by
| construction,  avoids  multiple inclusions.  Multiple inclu-
| sions are a bane of systems programming.  It's not  rare  to
| have files included five or more times to compile a single C
| source file.  The Unix /usr/include/sys  stuff  is  terrible
| this way.
| 
|      There's a little  dance  involving  #ifdef's  that  can
| prevent a file being read twice, but it's usually done wrong
| in practice - the #ifdef's are in the file itself,  not  the
| file  that  includes  it.   The result is often thousands of
| needless lines of code passing through the lexical analyzer,
| which is (in good compilers) the most expensive phase.
| 
|      Just follow the simple rule.

参考: Indian Hill C Style and Coding Standards より

|      Header files should not be nested.  Some  objects  like
| typedefs  and  initialized  data  definitions cannot be seen
| twice by the compiler in one compilation.  On non-UNIX  sys-
| tems this is also true of uninitialized declarations without
| the extern keyword12.  This can happen if include files  are
| nested and will cause the compilation to fail.

参考: CFAQ より

| 10.7:	ヘッダが、別のヘッダを#includeすることは容認されているのか。
| 
| A:	これは書き方に関する質問であり、この質問に関する議論は盛り上が
| 	る。多くの人が、入れ子の#includeは止めたほうがいいと信じている。
| 	権威あるIndian Hillスタイルガイド(質問17.9参照)は、以下の理由
| 	により入れ子はよくないとしている。関連する定義を捜しにくする。
| 	ファイルが二回以上#includeされると多重宣言エラーとなる。
| 	Makefileの保守が面倒になる。一方#includeを入れ子にするとヘッダ
| 	ファイルをモジュールを組み上げるように使うことができる(ヘッダ
| 	ファイルが必要なファイルを#includeする。使い手はいちいち
| 	#includeしてまわらなくてすむ。いちいち#includeしてまわるのは手
| 	に負えなくなって頭痛の種となる)。grep(やタグファイルのようなツー
| 	ル)があれば、定義がどこにあるのか見つけるのを楽になる。有名な
| 	トリック
| 
| 		#ifndef HEADER_FILE_NAME
| 		#define HEADER_FILE_NAME
| 		…ヘッダファイルの中身…
| 		#endif
| 
| 	は(各ヘッダファイルごとに異なるマクロ名を用意して、#ifndefでくくる)
| 	ヘッダファイルの「べき等(A * A = A)」を可能にする(2度以上
| 	読み込まれても問題が発生しない)。こうすれば何回#includeしても
| 	問題ない。Makefileを保守するための自動化ツール(どっちにしても、
| 	この手のツールはプロジェクトが大きくなれば絶対必要となる。質問
| 	18.1を参照のこと)は、入れ子になった#includeファイルの依存関係
| 	をうまく作り出す。質問17.10を参照のこと。


-- Satoru Takabayashi