スポンサーリンク

可変長引数マクロで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

スポンサーリンク