C 言語 | 前処理 | マクロ定数 - #define, #undef

#define を使うと、トークン列へ名前を付けられる。意味のある定数や再利用する式に便利である。

トークン列の展開

#define ディレクティブはマクロを作成する。プリプロセッサはコンパイル前に、マクロ名を指定したトークン列へ置き換える。

#define 識別子 トークン列

置換内容には任意の有効なトークン列を指定できる。

#define MAIN int main() { return 0; }
MAIN

マクロは、オプション値やエラーコードなどの名前付き定数によく使われる。

コード 1

#include <stdio.h>
#define KITTY "Kitty on your lap"
#define BUFFER 0xFF

int main() {
 char str[BUFFER] = KITTY;
 printf("%s\n" , str);
 return 0;
}

マクロにはローカルスコープがない。不要になった定義を削除するには #undef を使う。

#undef ディレクティブ

#undef 識別子

コード 2

#include <stdio.h>

int main() {
#define PI 3.14159265358979323846
 printf("%f\n" , PI); /* OK */
#undef PI
 /* printf("%f\n" , PI); error */
 return 0;
}

#undef PI より後では PI は未定義になる。一時的なマクロ定義を削除すると、名前の衝突を防げる。