プログラミング言語 C の新機能 Part IV: CPP#1:気分は空っぽ
(1999/04/02 [金])
さてさて、新しい C 言語ではプリプロセッサにもいくつかの新機能や新しい話題があります。それらを今回から 6 回シリーズでお送りします。まず、今回の話題は空のマクロ引数です。
今までのプリプロセッサでは、関数型マクロを利用するときには、その中に必ず引数を書く必要がありました。例えば、ある値とあるアルファベットを指定するとそれを二つをくっつけた値に置き換えるマクロを考えましょう(long 型の整数定数には'L'の記号が必要ですね)。しかし、ある場合には、そのアルファベットが不要です(int 型の整数定数には記号は必要ありません)。 今までのプリプロセッサでは、関数型マクロで定義された引数には必ず値を指定する必要がありました。このような要求を満たすためには、従来のプリプロセッサでは、次の例のように記述する必要がありました。
例の中の赤字の部分は規格の範囲内の記述ではできないものです。もし記述するとその振る舞いは未定義になります。しかし、今度の C 言語の仕様によるプリプロセッサでは、関数型マクロ引数に何も引数をかかなくてもよい形式が許されるようになりました(empty macro arguments)。従って、前述の例は新しいプリプロセッサでは、次のように記述することができます。
このように、今度のプリプロセッサでは応用の範囲が少し広がることになりました。
今までのプリプロセッサでは、関数型マクロを利用するときには、その中に必ず引数を書く必要がありました。例えば、ある値とあるアルファベットを指定するとそれを二つをくっつけた値に置き換えるマクロを考えましょう(long 型の整数定数には'L'の記号が必要ですね)。しかし、ある場合には、そのアルファベットが不要です(int 型の整数定数には記号は必要ありません)。 今までのプリプロセッサでは、関数型マクロで定義された引数には必ず値を指定する必要がありました。このような要求を満たすためには、従来のプリプロセッサでは、次の例のように記述する必要がありました。
/* * cpp: 空マクロサンプル1 (c)1999 seclan * ver1.00 1999/04/02 最初のバージョン */ #define catval(val,suf) val ## suf main() { long l = catval(3,L); //3L に展開。 int i = catval(3,); //記述不可能。未定義の動作。 } |
例の中の赤字の部分は規格の範囲内の記述ではできないものです。もし記述するとその振る舞いは未定義になります。しかし、今度の C 言語の仕様によるプリプロセッサでは、関数型マクロ引数に何も引数をかかなくてもよい形式が許されるようになりました(empty macro arguments)。従って、前述の例は新しいプリプロセッサでは、次のように記述することができます。
/* * cpp: 空マクロサンプル (c)1999 seclan * ver1.00 1999/04/02 最初のバージョン */ #define catval(val,suf) val ## suf main() { long l = catval(3,L); //3L に展開。 int i = catval(3,); //OK。3 に展開が保証される。 } |
このように、今度のプリプロセッサでは応用の範囲が少し広がることになりました。
by seclan