=====#define=====
文法:
#define マクロ名 置換文字列
#defineコマンドはそのファイル中の文字列を置換するのに使用されます。別の言い方をすると、#defineはコンパイラに対して、ファイルを調べさせて、その中で見つけた「マクロ名」の文字列を「置換文字列」に置き換えるように命令します。#defineの置換文字列は、行末までの文字列が使用されます。
以下の例は少なくともC言語でよく見られる#defineの使用例です:
#define TRUE 1
#define FALSE 0
...
int done = 0;
while( done != TRUE ) {
...
}
#defineコマンドにはもう一つ、引数を持たせて疑似関数のように使用することができるという機能があります。以下のサンプルを見てください。
#define absolute_value( x ) ( ((x) < 0) ? -(x) : (x) )
...
int num = -1;
while( absolute_value( num ) ) {
...
}
このような複雑なマクロを定義する場合には、全体をカッコでくくる方が良いといわれています。上記の例で注意すべきなのは、変数"x"は常にカッコでくくられています。こうすることで、すべての箇所で、0と比較したり-1とかけ算をするまえに適切に評価されるようになります(訳注:優先順位のマジックで、予想外の評価順になるのを防げます)。また、マクロ全体も同じようにカッコでくくる方が良いでしょう。他のコードがマクロの中に割り込んでくるのを防ぐことができます。もしも不注意にマクロを扱うと、コンパイラが予想外の解釈をするという、このようなリスクを抱えることになります。
最後に、整数の1から20までをループして出力するための、汎用的なインクリメント機能を提供する#defineコマンドの使用例を示します:
#define count_up( v, low, high ) \
for( (v) = (low); (v) <= (high); (v)++ )
...
int i;
count_up( i, 1, 20 ) {
printf( "i is %d\n", i );
}
関連トピック: [[sharp|# と ##]], [[preprocessor_if|#if,...,#endif]], [[undef|#undef]]