エラー/デバッグ出力関数の作成

必要な機能は

  • printfと同じように変数の内容を出力させられること
  • 書き込み後すぐフラッシュすること。(呼出し後すぐに異常終了しても大丈夫なように)←これ大事
  • デバック出力はマクロによって有効/無効が切り替えられること。(アサーションみたいな感じで)

これを満たすために作ってみました。

//
// エラー/デバッグ用出力。
// DEBUG_OUT(("format %d\n", num))
// のように括弧を2重にする必要がある。
//
#define ERROR_OUT(args)			do { printf args ; fflush(stdout); } while(false)
#if defined(DEBUG) || defined(_DEBUG)
	#define DEBUG_OUT(args)			do { printf("Dbg:"); printf args ; fflush(stdout); } while(false)
#else
	#define DEBUG_OUT(args)
#endif

(中略)

	// 標準出力と標準エラー出力をテキストファイルに設定。
	// こうしておくとコマンドラインから起動しなくても出力内容を見れる。
	freopen("stdout.txt", "w", stdout);
	freopen("stderr.txt", "w", stderr);

printfを使うので標準出力もテキストファイルに設定しておくことを忘れずに。
括弧2つになるのは気持ち悪いかもしれませんが引数の数を固定されないのは利点だと思います。
他の方式を使いたい人は使っても結構ですが、ここに掲載したソースがそのままではビルドできなくなります。


!!!Xcodeでやってる人に注意!!!
XcodeはDebug構成でビルドするときもマクロ"DEBUG"を自動では定義してくれません。
そこで自分で設定する必要があります。
画面上部メニューバーの「プロジェクト」→「プロジェクト設定を編集」と進み、「ビルド」タブを開きます。
「構成」が「アクティブな構成(Debug)」または単に「Debug」となっていることを確認し、下の長い長いリストの中から「プリプロセッサマクロ」の項目を探してください。
で、そこに"DEBUG"というマクロを追加しましょう。
これでDEBUG_OUTが使用できるようになります。