可変長引数マクロでprintf置き換えマクロを作成
識別子__VA_ARGS__を使って、可変長引数マクロを作成できます。
デバッグ用途にprintf関数でマクロを作成する時に便利ですね。
printfの置き換えマクロです。
#define TEST_PRINT(...) printf(__VA_ARGS__)
下記のように、第一引数の値を見て、printfする内容を変えるマクロも作成できます。
SUCCESSならOKを出力、FALSEなら実行中のファイル名、行数、関数を出力します。
参考:[c言語]ファイル名・行数・関数名をprintf出力
参考:[c言語]マクロを複数行にするときの注意点(コンパイルエラー対策)
#define SUCCESS 1
#define FALSE 0
#define TEST_PRINT_ERROR(status, ...) if(status){\
printf("OK\n");\
}else{\
printf("NG File;%s Line;%d Func;%s ", __FILE__, __LINE__, __func__ );\
printf(__VA_ARGS__);\
}
下記のような使い方も便利ですね。
DEBUG_XXが1ならprintf出力します。0ならprintf出力しないようになります。
デバッグなどでprintf出力したいときにはDEBUG_XXが1、そうでなければ0を定義します。
#define DEBUG_01 1
#define DEBUG_02 0
#define DEBUG_01_PRINT(...) if(DEBUG_01){printf(__VA_ARGS__);}
#define DEBUG_02_PRINT(...) if(DEBUG_02){printf(__VA_ARGS__);}
サンプルコード
下記がサンプルコードになります。
$ cat sample.c
#include <stdio.h>
#define SUCCESS 1
#define FALSE 0
#define TEST_PRINT(...) printf(__VA_ARGS__)
#define TEST_PRINT_ERROR(status, ...) if(status){\
printf("OK\n");\
}else{\
printf("NG File;%s Line;%d Func;%s ", __FILE__, __LINE__, __func__ );\
printf(__VA_ARGS__);\
}
#define DEBUG_01 1
#define DEBUG_02 0
#define DEBUG_01_PRINT(...) if(DEBUG_01){printf(__VA_ARGS__);}
#define DEBUG_02_PRINT(...) if(DEBUG_02){printf(__VA_ARGS__);}
int main(){
TEST_PRINT("Hello world.\n");
int x = 1, y = 5;
TEST_PRINT("x=%d y=%d\n", x, y);
int status = SUCCESS;
TEST_PRINT_ERROR(status, "x=%d y=%d\n", x, y);
status = FALSE;
TEST_PRINT_ERROR(status, "x=%d y=%d\n", x, y);
DEBUG_01_PRINT("01 x=%d y=%d\n", x, y);
DEBUG_02_PRINT("01 x=%d y=%d\n", x, y);
return 0;
}
下記が実行結果になります。
$ gcc -o sample sample.c $ ./sample Hello world. x=1 y=5 OK NG File;sample.c Line;31 Func;main x=1 y=5 01 x=1 y=5
