デバッグログ出力マクロ

気がつけば #define で可変長引数が使える時代になっていた。cygwinのgcc3(3.4.4)で確認。printfデバッグ用のマクロメモ。変数つかっちゃっているので名前のバッティングには注意すること。

log.c
#include <stdio.h>
#include <time.h>

#define DEBUG

#ifdef DEBUG
#define LOG(...) \
{\
  time_t ___t; \
  char  *___tp, *___p; \
\
  time(&___t); \
  ___tp = ctime(&___t); \
  for (___p = ___tp; *___p != '\0'; ___p++) { \
    if (*___p == '\n') { *___p = '\0'; break; } \
  } \
\
  FILE *___fd = fopen("_debug.log", "a"); \
  fprintf(___fd, "%s - ", ___tp); \
  fprintf(___fd, __VA_ARGS__); \
  fprintf(___fd, "\n"); \
  fclose(___fd); \
}
#else
#define LOG(...)
#endif

int main() {
  LOG("hogehoge %s", "fugafuga");
  LOG("one two %d %d", 1, 2);
  LOG("ログ取り");
  return 0;
}
コンパイル&実行

nkfEUCでコード書いちゃったから。

$ gcc log.c -o log
$ ./log.exe
$ cat _debug.log | nkf -E
Fri May 22 09:12:01 2009 - hogehoge fugafuga
Fri May 22 09:12:01 2009 - one two 1 2
Fri May 22 09:12:01 2009 - ログ取り