スポンサーリンク
可変長引数マクロで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
スポンサーリンク