マクロ置き換え

マクロ置き換えとは、マクロ名を置換要素並びで置き換える前処理指令である。
マクロ置き換えには、オブジェクト形式マクロと関数形式マクロがある。

#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の形式の整数定数。

Last updated:2018/08/03
Author:efn

';