C99じゃないコンパイラで、可変引数付きデバッグ用マクロを定義する例
余談ですが、C99では可変引数マクロ(__VA_ARGS__)という、今まで渇望されていた機能が搭載されています。
つぅか、__VA_ARGS__マクロの説明って、必ずデバッグ用に紹介されるんですよね。まぁ、当然ですけど。
とはいえ、C99に対応してないコンパイラってのも結構ある訳で。
じゃぁ、どうすんだ?と。
自分がデバッグ用マクロを定義する際に良く使うパターンを、以下にメモ書きしておきます。
#include <stdio.h> #include <stdarg.h> #include <assert.h> #define DBG dprintf("%s %d : ", __FILE__, __LINE__),dprintf #define D printf("%s %d : ", __FILE__, __LINE__),printf int dprintf(const char* fmt, ...) { char buff[1024]; va_list arg; va_start(arg, fmt); int ret = ::_vsnprintf(buff, sizeof(buff) / sizeof(buff[0]), fmt, arg); assert(ret >= 0); printf(buff); // これを、::OutputDebugStringに変えてもOK va_end(arg); return ret; } int main(void) { DBG("hello\n"); DBG("hello %d\n", 1); D("hello world %d\n", 123); return 0; } 実行例: test2.cpp 24 : hello test2.cpp 25 : hello 1 test2.cpp 26 : hello world 123
普通、'#define DBG'の所は、'#define DBG(f)'という風に書きますが、わざと'#define DBG'に留めているのがミソ。
ちなみに、このテクは、MFCのソースからパクってます。