assert(3)の man ページと習慣 ( <assert.h>
C または<cassert>
C++ で) で提案されている通常の方法は、非デバッグ コンパイル用NDEBUG
にコマンド ラインで定義することです (たとえば、でコンパイルします)。gcc -Wall -DNDEBUG
あなたMakefile
はリリースモードで(そしてデバッグモードCPPFLAGS += -DNDEBUG
でコンパイルして)できます。g++ -Wall -g
私自身の習慣は、次のようなものを持つことかもしれません
#ifndef NDEBUG
#define dbgprintf(Fmt,...) do{fprintf(stderr,"%s:%d:" Fmt "\n", \
__FILE__, __LINE__, \
##__VA_ARGS__);}while(0)
#else
#define dbgprintf(Fmt,...) do{}while(0)
#endif
共通のヘッダー ファイルで使用dbgprintf("i=%d", i)
し、コードの他の場所で使用します。マクロ引数で定数文字列連結を使用Fmt
し、それに定数の改行を追加し、デバッグ出力にソース ファイル名と行番号が含まれていることに注意してください (必要に応じて使用することもでき__func__
ます)。純粋な C++ コードでは、代わりに
#ifndef NDEBUG
#define DBGOUT(Out) do{std::out << __FILE__ << ":" << __LINE__ \
<< " " << Out << std::endl;}while(0)
#else
#define DBGOUT(Out) do{}while(0)
#endif
私のタイプの特定の定義を使用DBGOUT("i=" << i)
するという利点がありoperator <<
ます。