デバッグ用の出力関数

最近の gcc だと、可変長引数マクロを使っても特に警告を出さないようです. そこで、以下のようなマクロを定義しておくと、デバッグメッセージのON/OFFが手軽にできて便利です.

#ifdef __DEBUG__
#define dprintf(fmt,...)            \
    printf("[%s]%d:" fmt  "\n",__FUNCTION__,__LINE__,__VA_ARGS__)

#define dputs(str)                  \
    printf("[%s]%d:" str  "\n",__FUNCTION__,__LINE__)

#else
    #define dprintf(fmt,...)    while(0){}
    #define dputs(str)  while(0){}
#endif

これを使ったサンプルプログラムです.

//ここで ON / OFF を切り替える
//#define __DEBUG__
main()
{   
    int data=10;
    dputs("hoge");
    dprintf("data %d",data);
}

#define __DEBUG__ が定義されている場合は、

main()
{
 int data=10;
 printf("[%s]%d:" "hoge" "\n",__FUNCTION__,20);
 printf("[%s]%d:" "data %d" "\n",__FUNCTION__,21,data);
}

のように展開されるため、デバッグメッセージが改行/ファイル名/行番号込みで出力されます. 一方、#define __DEBUG__ を定義していない場合は

main()
{
 int data=10;
 while(0){};
 while(0){};
}

と展開されるため、メッセージは出なくなります.