マクロ置き換え
マクロ置き換えとは、マクロ名を置換要素並びで置き換える前処理指令である。
マクロ置き換えには、オブジェクト形式マクロと関数形式マクロがある。
#define(オブジェクト形式マクロ) 構文
#define 識別子 置換要素並び
defineの直後に記述してある識別子をマクロ名という。
オブジェクト形式マクロは、 これ以降のマクロ名を置換要素並びで置き換える。
#define(関数形式マクロ) 構文
#define 識別子(識別子並び) 置換要素並び
識別子並びは省略可能で、仮引数を指定し、個々の仮引数は「,」で区切り、最後に省略記号「...」を指定してもよい。
関数形式マクロは、 これ以降のマクロ名とそれに続く「(」からそれに対応する「)」までを、置換要素並びで置き換える(マクロ呼出し)。
マクロ定義の有効範囲
マクロ定義の有効範囲は、そのマクロ定義から、対応する#undef指令を検出するまで又は前処理翻訳単位の最後までである。
マクロ定義を無効にするには、次のように記述する。
#undef(関数形式マクロ) 構文
#undef 識別子
識別子で無効にしたいマクロ名を指定する。
#defineを使用した記述例
// #define program in C.
#include <stdio.h>
#define CHECK_VAL 1
#define CHECK(a, b) (a = b == CHECK_VAL 1 ? 123 : a)
int main(int argc, char *args[])
{
int val = 0, chk = CHECK_VAL;
CHECK(val, chk);
printf("%d\n", val);
return 0;
}
↓ 前処理時に以下のように解釈される
// #define program in C.
... stdio.h の内容 ...
int main(int argc, char *args[])
{
int val = 0, chk = 1;
val = chk == 1 ? 123 : val;
printf("%d\n", val);
return 0;
}
実行結果
val=123
あらかじめ定義されたマクロ名
C 言語規格では、現在使っている処理系が規格合致処理系であるかどうか、そして言語規格のどの
バージョンに準拠しているのか、を調べられるように、いくつかのマクロをあらかじめ定義されています。
(C言語規格 6.10.8 を参照)
また、これらのマクロは、C 言語規格のどの機能を処理系がサポートしているか調べるためにも使えます。
前処理指令 | 概要 |
---|---|
__DATE__ |
前処理翻訳単位の翻訳の日付 ("Mmm dd yyyy"の形式をもつ単純文字列リテラル) |
__FILE__ |
ソースファイル名(単純文字列リテラル) |
__LINE__ |
現在のソース行の行番号(整数定数) |
__STDC__ |
整数定数1.規格合致処理系であることを示す。 |
__STDC_HOSTED__ |
処理系が規格合致ホスト処理系の場合、整数定数1。 そうでない場合、整数定数0。 |
__STDC_VERSION__ |
整数定数199901L。 |
__TIME__ |
前処理翻訳単位の翻訳の時刻。 ("hh:mm:ss"の形式の単純文字列リテラル) |
__STDC_IEC_559__ |
「IEC60559 浮動小数点演算」の規定に合致することを
示すための整数定数1。 |
__STDC_IEC_559_COMPLEX__ |
「IEC60559 互換複素数演算」の規定に合致することを
示すための整数定数1。 |
__STDC_ISO_10646__ |
型wchar_tの値が、ISO/IEC 10646で定義された文字の
符号化表現をもつことを示すためのyyyymmLの形式の整数定数。 |