namazu-dev(ring)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
avoiding include files nesting
- From: Satoru Takabayashi <satoru-t@xxxxxxxxxxxxxxxxxx>
- Date: Fri, 19 Nov 1999 12:06:24 +0900
入れ子の 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