[PR]

dbgprintf マクロを使う

戻る

 マクロ dbgprintf はデバッグ時に関数 printf() の代わりに利用すると便利なデバッグ出力用のマクロです。
 マクロ dbgprintf はコンパイルの前処理段階で関数 printf() の呼び出しに置き換えられます。
 マクロ dbgprintf が定義される前にマクロ NDEBUG が定義された場合、マクロ dbgprintf は出力を行いません。
 関数 printf() を直に呼び出すこととの違いは、リリース時にマクロ NDEBUG をマクロ dbgprintf より前の位置で定義することで、マクロ dbgprintf によるデバッグ用の出力を除去できることです。
 マクロ dbgprintf() は以下のようにして定義することができます。

	// 
	// dbgprintf( param-list );
	// 
	#ifdef NDEBUG
	#define dbgprintf   1 ? (void)0 : (void)
	#else // #ifdef NDEBUG
	#define dbgprintf   printf
	#endif // #ifdef NDEBUG

 マクロ NDEBUG が定義されていない場合、マクロ dbgprintf は関数 printf への単純な置換です。

	printf( param-list );

 マクロ NDEBUG が定義されている場合、マクロ dbgprintf は以下のように展開されます。
 条件演算子の 条件式 が 真 であるため、引数 param-list は評価されません。

	1 ? (void)0 : (void)( param-list );

 上記でマクロ dbgprintf の定義が関数 printf への置換であるのは一つの例に過ぎません。
 下記のように printf 型の関数を返す関数や C++ の一時オブジェクトを使って自動的にファイル名や行番号を出力させることもできます。

	#define dbgprintf   (get_print_proc( __FILE__, __LINE__ ))
	#define dbgprintf_t( __FILE__, __LINE__ )->print

 上記2例は以下のように展開されます。

	(get_print_proc( __FILE__, __LINE__ ))( param-list );
	dbgprintf_t( __FILE__, __LINE__ )->print( param-list );

関連

assert マクロを使う
verify マクロを使う
コンパイル時アサート
出力書式の使えるメッセージボックス


Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp

あなたの作った歌をソフトウェアが人間の声で歌う! これぞ近未来のソフトウェア!
これを流行の一言ですませてはいけない! 技術的にもコンセプト的にも凄い!