プリプロセッサ文


1.#include

 
指定のヘッダファイルの内容をこの位置に挿入します。

    #include <stdio.h>   ヘッダファイルstdio.hの内容をこの位置に挿入する
    #include <math.h>   ヘッダファイルmath.hの内容をこの位置に挿入する

 したがって、予め必要なことをファイルの中に書いておき、そのファイルを#includeで挿入してやれば、ソースプログラムに直接書くのと同じことになります。自作のヘッダファイルを作り、それを「#include文」でプログラムに取り込むこともできます。そのときには、

    #include "jisaku.h"

のように「<」「>」の代わりに「"」を使います。

    #include <stdio.h>
    #include "jisaku.h"

の違いは、下の二重引用符のほうは、まずカレントディレクトリの中からヘッダファイルを探して、もしなければ、ヘッダファイルの置かれているディレクトリを探します。それに対して、上の「<>」の方は、カレントディレクトリの中を探さずにヘッダファイルのディレクトリだけを探します。
 自作のヘッダファイルは、ソースプログラムと同じディレクトリの置いておくことが多いので、普通二重引用符の方を使います。


2.#define

 「#define」は、記号定数の定義、マクロ定義などのために使用します。

(1)#define 記号定数 値
 コンパイルの前に、プログラム中にある記号定数を値に置き換えます。
 (例)#define SIZE 16
  プログラム中にある記号定数SIZEを値16に置き換えます。
 (例)#define N 100
  プログラム中にある記号定数Nを値100に置き換えます。

(2)#define マクロ名 置換文字列
 プログラム中のマクロ名を置換文字列に置き換えます。
 (例)#define FOREVER for( ; ; )
  プログラム中の「FOREVER」を「for( ; ; )」に置き換えます。
 引数つきのマクロも定義できます。
 (例)#define max(A, B) ((A) > (B) ? (A) : (B))
  プログラム中の「max(A, B)」を「((A) > (B) ? (A) : (B))」置き換えます。ただし、この場合は、maxの引数A, Bの部分が後半分のAとBの箇所に入ります。例えば、「max(x + 1, 3 * y)」と書かれていれば、「((x + 1) > (3 * y) ? (x + 1) : (3 * y))」に置き換えられます。

【 注 】 #define sqr(x) x * x
 は間違いの例です。もし、sqr(a + b)と書かれている場合、「a + b * a + b」に置換され、間違った答えになってしまいます。正しくは、「#define sqr(x) (x) * (x)」のように書いておかなければなりませんね。


3.その他のプリプロセッサ文

(1)#ifdef 記号定数
    :
 #endif

  記号定数が定義されていれば、#endifまでの範囲を残します。逆に記号定数が定義されていなければ、#endifまでの部分を削除してコンパイルしないようにします。例えば、プログラム中の誤りを修正するデバッグ中だけ実行したい処理を書いておくことなどに使われます。

 #ifdef DEBUG
  printf("DEBUG: x = %d\n", x);
 #endif

 記号定数DEBUGが定義されているときは、デバッグのために、変数xのその時点の値を出力する例です。


(2)#if 条件 〜 #elif 条件 〜 #else 〜 #endif
 のような書き方で、条件つきコンパイルなどが指定できます。詳しくは、「プログラミング言語C」(B.W.カーニハン/D.M.リッチー)などを参考にしましょう。