C のプリプロセッサはコンパイルの前にソースコードに対して様々な操作を行う。プリプロセッサへの命令がプリプロセッサディレクティブ。これまでにヘッダファイルを読み込む #include を使ってきた。
ここでもうひとつ、#define というディレクティブが出てきた。大まかに言うと、ソースコード中の特定の文字列を別の文字列に置き換えるものだ。これはマクロ置換(macro substitution) と呼ばれる。#define の一般的な形式は次のとおり。
#define マクロ名 文字列
マクロ名は C で有効な識別子なら何でもいい。大文字も小文字も使える。ただ、大文字で書くのが通常だそう。
マクロ名と文字列は1つ以上の空白文字で区切られていなければいけない。
文字列の方は途中に空白を含んでも構わない。ただし、ディレクティブ自体が1行で完結している必要があるので、行末までが有効な文字列ということになる。
次の例は MAX というマクロを定義している。プリプロセッサがこれを処理すると、for ループの中の MAX という文字列が 100 という文字列に置き換わる。
#incluce #define MAX 100 int main(void) { int i; for (i = 0; i < MAX; i++) { printf("%d\n", i); } return 0; }
結果としてこのループは、コンパイラにはこう見える。
for (i = 0; i < 100; i++) { printf("%d\n", i); }
いったん定義したマクロはほかのマクロの中でも使える。次の例は正しい使い方だ。
#define SMALL 1 #define MEDIUM SMALL + 1 #define LARGE MEDIUM + 1
マクロ名が二重引用符で囲まれた中に出てきた場合には、置き換えが行われない。例えば、
#define ERROR "error ocured."
とあっても、
printf("ERROR: Try again.\n")
のなかの ERROR は置き換えられない。これはちょっと注意だな。