#includeは出世したのかい?

amnesiac birdheadの『プログラミングのおまじない』を読む。

C言語の#includeの説明がすごい。以下斜体部引用。

includeは何のためにあるのか?というと、Cの場合、私の浅い理解だと、確か…ヘッダファイルをincludeすることによって

1. シンボルテーブルにシンボル名(関数とか変数の名前)が登録される(登録されない関数は実行時に呼び出すことができない)
2. リンクをスムーズに行うために、同じヘッダファイルを使うことによってlibc.soのシンボルテーブルと一貫性のあるシンボルテーブルを作成することができる(実際のprintf関数などはlibc.soに書かれているため、libc.soとのリンクが正確に行われないと、そもそもprintfを呼び出せない)。
3. Cコンパイラがデフォルトパスを持っているため、そのリストに列挙されているパスでファイルをマッチさせることができる
4. libc.soが持っているシンボル全てをひとつのヘッダファイルに押し込むと膨大な量になってしまうため、いくつかに分割する(膨大な量になると、シンボルのサーチも大変そうだし、何より実行ファイルが大きくなりすぎてしまう)

という効果が得られるから、だったような。

全然違うでしょう :shock: includeは、ただ単純に書かれたところに指定されたファイルを読み込んで展開するだけのマクロです。

それ以上でも、それ以下でもありません。

includeは、おまじないでもないし、ましてやシンボルテーブルやlibc.soなどが関係する黒魔術でもありません ;)

そう言えば、昔コードを探しても関数がどこにもない :( おかしいなぁ~find, grepしても見つからないよ。でも、コンパイル、リンクは通ってるので、どこかにあるはずと探していたら…ヘッダーファイルの中に書かれてましたとさ :shock:

さすがにビックリしましたけど、お行儀を気にしなければ…そんな書き方までできるのがincludeなのでした。

プログラミング言語C ANSI規格準拠 プログラミング言語C ANSI規格準拠
B.W. カーニハン D.M. リッチー 石田 晴久

プログラミング言語Cアンサー・ブック プログラミング作法 カーニハン&リッチー『プログラミング言語C』を読む (KS) C言語による最新アルゴリズム事典 (ソフトウェアテクノロジー) 新ANSI C言語辞典
by G-Tools

TrackBack URL :

No comments yet. Be the first.

Leave a reply