|
>1.デバッグ出力用の共通関数の呼び出しをコンパイル時に読み込まない。
>3.デバッグ出力に関係するコードもコンパイル時に読み込まない。
コンパイル時に読み込まないとは?
コンパイルしないのであれば,デバッグ用にならないですが。
>2.#ifdefを個別に定義しない。(デバッグ関数を使用する度に記述しない。)
> (共通のヘッダファイルに一ヶ所登録がベスト?)
ヘッダファイルで切り分ければ問題ないと思います。
仕様がはっきりしないですが,とりあえずデバッグ出力用として簡単なのものを作るとすると,
#ifndef NDEBUG
void DebugOut (const char *, ...);
#else
#define DebugOut (void)
#endif
なんていうヘッダファイルを用意しておいて,別の翻訳単位に
#include <stdio.h>
#include <stdarg.h>
void DebugOut (const char * format, ...)
{
va_list ap;
va_start(ap, format);
vfprintf(stderr, format, ap);
va_end(ap);
}
なんて関数を用意するだけです。
例えば,
DebugOut("%d", i);
というコードは,デバッグ用のプログラムをコンパイルした場合であれば関数DebugOutを直接呼び出しますが,
リリース用のプログラム(NDEBUGを定義している)をコンパイルした場合であれば,
(void)("%d", i);
となり,無作用の文なのでおそらく最適化で削除されます。
また,関数呼び出しや副作用を持つ式を含んでも,問題なく実行されます。
|