2012-02-10 18 views
10

標準のCアサートマクロは、マクロNDEBUGが定義されている場合、「デバッグしていません」という意味で無効になります。これは、#ifndef NDEBUG //DebuggingCode #endifのような本当にひどい二重否定的なケースにつながります。 RELEASEは用語のよりよい選択だったようですが、何らかの理由なく標準委員会がそうしたとは思えません....RELEASEの代わりにNDEBUGを使用するのはなぜですか?

+8

「NDEBUG」は単に* no debug *を意味します。 'RELEASE'はもっと多くのことを意味するかもしれない。 – cnicutar

+1

「デバッグ」/「デバッグしない」は、プログラミング環境のほとんどすべてに意味を持ちます。 "リリース"/"ソフトウェアのリリース"/"リリースの作成"は、コンパイラフラグを選択してからずっと前とは全く異なる会話です。 –

+0

'#if defined(RELEASE)' '#define NDEBUG''#else'' #undef NDEBUG''#endif' – pmg

答えて

5

マクロを公開すると、コード配布される準備が整っています。一方、NDEBUGはデバッグが完了したことを意味し、テストの準備が整っています。

私はまた、物事をオフにすることがすべてをオンにしていることを確認するよりも優れていると思います。そういうわけで、ほとんどのOSは、多くの人がそれを必要としないときにほとんどのものをオンにしています。

ちょうど私の謙虚な考え。

5

マクロNDEBUGは、assertの振る舞いを制御します。

通常、他の用途には使用しないでください。余分なデバッグトレース出力のような他のもののためにそれを使用するならば、この余分なコードなしでアサーションを有効にしてアプリケーションをビルドするオプションがありません。

あなた自身のプリプロセッサシンボル、たとえばMY_TRACEを定義して使用することをお勧めします。また、0または1に定義し、#if MY_TRACEを使用してください。プリプロセッサ式で初期化されていない変数を使用するときに警告を出すようにコンパイラを設定すると、シンボルを使用してファイルを適切に初期化せずにキャッチすることができます。

+1

私は他の何ものにも使わないのですか? –

+4

もし、 'assert'を制御する以外に何も使用しないなら、' #ifndef NDEBUG'を書く必要はありません。 – Lindydancer

+2

珍しい難解なバグを追跡するために 'assert'を有効にしなければならないときに何千ものデバッグ出力が出ることはないでしょうか? –

3

私は

私は推測することができます....標準化委員会がこれを行うにはいくつかの理由なし[assert()制御するための名前NDEBUGを使用することを選択]していると考えているが、私はできません以前の標準には、アサーションマクロの動作を制御するためにさまざまな実装で使用されるいくつかの異なる名前が存在する可能性があると疑われ、委員会は関連しない理由で既存のコードでは使用されない。私はRELEASEがかなりのコードでマクロとして使用されるのがむしろ一般的かもしれないと思うので、その名前(またはDEBUG)を使用してassert()マクロを制御すると、コンフリクトが発生する可能性がありますアサーションは、コードの部分だけでオンにします)。

0

エッフェルの長期ユーザーとして、私はそれが別の方法で使用されていると言えますが、debug/nodebugです。指摘されているように、唯一の効果は、assert文を無効にすることです。アサートの目的は、事前および事後条件チェックを追加することです。それを頻繁に使用することをお勧めします。プログラムのパフォーマンスを10倍以上に低下させる可能性があります。これは、(Poor Men's)契約による設計と呼ばれています。

NDEBUGを使用している場合、実際にはデバッグを終了しているわけではありません。重いデバッグ計測器が削除されているだけです。

よく知られているDebug/Releaseは、あくまでも実用的な開発では、良い理由のためにAlpha、Beta、Releaseのリリースモデルがある場合には最適なケースではありません。

alphaソフトウェアでは、NDEBUGとデバッガシンボルなしでコンパイルするので、アルファソフトウェアはバグです。ベータはNDEBUGのセットとデバッガのシンボルでコンパイルされています(そしておそらくは最適化スイッチとともに)。最後のリリースはNDEBUGと完全最適化でコンパイルされます。

関連する問題