#defineプリプロセッサディレクティブ

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 は置き換えられない。これはちょっと注意だな。

カテゴリー: C パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください