ふにゃるんv2

もとは、http://d.hatena.ne.jp/Wacky/

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のソースからパクってます。