9.プリプロセッサとメイクファイル

9-2. ファイルのインクルード

いままでは、この #include<stdio.h> は printf() などを使用するために必要なので記述してください。とだけ説明していました。

今回は、#include について詳しく解説します。

まず、# の記号。
この記号があるとその行はプリプロセッサ行として扱われます。
注意しないといけないのは、効力がその行限りと言う事です。
つまり、

# include < stdio.h >

は良くても、(LSI-CとVC++で確認)

# include
<stdio.h>
や、

#include
#<stdio.h>
はダメと言う事です。

そして、このプロプロセッサはコンパイラに引き渡される前にソースファイルに対してマクロ処理やファイルの取りこみそしてコメント文の除去を行います。

例えば、

/* C-Production と表示 */
#include<stdio.h>
main()
{
    printf("C-Production\n");
}

というプログラムがあるとします。
これをコンパイルすると、最初に前処理としてコメント文が抹消されプリプロセッサによる処理が行われます。

include 疑似命令は指定したファイルをコンパイル時に挿入します。
上の場合だと、コンパイル時の状態は、

------------stdio.hの部分------------
              .
              .
int printf(const char *format, ...);
              .
              .
-------------------------------------
main()
{
    printf("C-Production\n");
}

のようになっています。

あと、もうひとつ例を

┌main.c─────────┐┌file──────────┐
│main()         ││            │
│{            ││int x=1,y=2,z;     │
│#include"file"     ││z=x+y;         │
│}            ││            │
└────────────┘└────────────┘

とします。この場合もコンパイルする時は、

main()
{

int x=1.y=2.z;
z=x+y;

}

となります。つまりincludeは一緒にコンパイルするファイルを取りこむ時に使われます。(翻訳単位が同じという意味)

◇ファイル指定の “…” と の違い。

今日の最後は、ファイル指定につかう括弧の違いについてです。
この2つの違いは取りこむファイルを探す場所の順番にあります。

の場合はあらかじめコンパイラ等の設定ファイルに定義されているライブラリの場所から検索し無ければソースファイルのカレントディレクトリを検索します。

次に”…”の場合はソースファイルのカレントディレクトリから検索し無ければライブラリから検索します。(LSI-Cではライブラリ検索しません)

これによって、ライブラリとカレントディレクトリに同名のファイルがある時どちらを取りこむかを指定することができます。

自作(拡張)ライブラリを取りこむ時は”…”、標準ライブラリから取りこむ時はを使うのが普通になります。