6

コードブロックを使用して C++ プログラムを作成しています。デバッグ目的で、コードブロックのビルド ターゲットが「DEBUG」または「RELEASE」に設定されているかどうかを知る必要があります。

私はすでにこれを試しました:

#ifdef DEBUG
    printf("Debug-Message");
#endif

この

#ifdef _DEBUG
    printf("Debug-Message");
#endif

しかし、この言葉はどれも定義されていません。Building-Target を変更するたびに、自分で DEBUG を定義して変更する必要がありますか、それともわからない単語がありますか?

4

2 に答える 2

6

Building-Target を変更するたびに、自分で DEBUG を定義して変更する必要がありますか、それともわからない単語がありますか?

Code::Blocks によってデフォルトで何かが設定されているかどうかはわかりません。ただし、独自の #defines を定義すると

Project->Build options...->[Debug|Release]->#defines 

ビルド ターゲット (DEBUG または RELEASE) を切り替えるときに、それらを変更する必要はありません。Debug ビルドに固有の値と、Release ビルドに固有の値を定義できます。

新しいプロジェクトごとに毎回手動で入力する必要がないようにするには、Debug/Release #defines だけで小さなプロジェクトを作成し、それをプロジェクト テンプレートとして保存してから、そのプロジェクト テンプレートから新しいプロジェクトを作成します。

于 2012-10-20T11:46:43.040 に答える
3

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 <<ます。

于 2012-10-20T10:51:52.283 に答える