標準のCアサートマクロは、マクロNDEBUG
が定義されている場合、「デバッグしていません」という意味で無効になります。これは、#ifndef NDEBUG //DebuggingCode #endif
のような本当にひどい二重否定的なケースにつながります。 RELEASEは用語のよりよい選択だったようですが、何らかの理由なく標準委員会がそうしたとは思えません....RELEASEの代わりにNDEBUGを使用するのはなぜですか?
答えて
マクロを公開すると、コード配布される準備が整っています。一方、NDEBUGはデバッグが完了したことを意味し、テストの準備が整っています。
私はまた、物事をオフにすることがすべてをオンにしていることを確認するよりも優れていると思います。そういうわけで、ほとんどのOSは、多くの人がそれを必要としないときにほとんどのものをオンにしています。
ちょうど私の謙虚な考え。
マクロNDEBUG
は、assert
の振る舞いを制御します。
通常、他の用途には使用しないでください。余分なデバッグトレース出力のような他のもののためにそれを使用するならば、この余分なコードなしでアサーションを有効にしてアプリケーションをビルドするオプションがありません。
あなた自身のプリプロセッサシンボル、たとえばMY_TRACEを定義して使用することをお勧めします。また、0
または1
に定義し、#if MY_TRACE
を使用してください。プリプロセッサ式で初期化されていない変数を使用するときに警告を出すようにコンパイラを設定すると、シンボルを使用してファイルを適切に初期化せずにキャッチすることができます。
私は他の何ものにも使わないのですか? –
もし、 'assert'を制御する以外に何も使用しないなら、' #ifndef NDEBUG'を書く必要はありません。 – Lindydancer
珍しい難解なバグを追跡するために 'assert'を有効にしなければならないときに何千ものデバッグ出力が出ることはないでしょうか? –
私は
私は推測することができます....標準化委員会がこれを行うにはいくつかの理由なし[assert()
制御するための名前NDEBUGを使用することを選択]していると考えているが、私はできません以前の標準には、アサーションマクロの動作を制御するためにさまざまな実装で使用されるいくつかの異なる名前が存在する可能性があると疑われ、委員会は関連しない理由で既存のコードでは使用されない。私はRELEASE
がかなりのコードでマクロとして使用されるのがむしろ一般的かもしれないと思うので、その名前(またはDEBUG
)を使用してassert()
マクロを制御すると、コンフリクトが発生する可能性がありますアサーションは、コードの部分だけでオンにします)。
エッフェルの長期ユーザーとして、私はそれが別の方法で使用されていると言えますが、debug/nodebugです。指摘されているように、唯一の効果は、assert文を無効にすることです。アサートの目的は、事前および事後条件チェックを追加することです。それを頻繁に使用することをお勧めします。プログラムのパフォーマンスを10倍以上に低下させる可能性があります。これは、(Poor Men's)契約による設計と呼ばれています。
NDEBUGを使用している場合、実際にはデバッグを終了しているわけではありません。重いデバッグ計測器が削除されているだけです。
よく知られているDebug/Releaseは、あくまでも実用的な開発では、良い理由のためにAlpha、Beta、Releaseのリリースモデルがある場合には最適なケースではありません。
alphaソフトウェアでは、NDEBUGとデバッガシンボルなしでコンパイルするので、アルファソフトウェアはバグです。ベータはNDEBUGのセットとデバッガのシンボルでコンパイルされています(そしておそらくは最適化スイッチとともに)。最後のリリースはNDEBUGと完全最適化でコンパイルされます。
- 1. なぜAssembly.LoadFromの代わりにAssembly.LoadFileを使用しますか?
- 2. WCF/Silverlight:なぜクライアントの代わりにChannelFactoryを使用するのですか?
- 3. なぜRabbitMQの代わりにCeleryを使用するのですか?
- 4. なぜJavaの代わりにClojureを使用するのですか
- 5. 代わりにカスタムBeanのライフレイ・ユーザー・オブジェクトを使用するのはなぜ
- 6. なぜmemo.LineはTStringListの代わりにTStringsを使用しますか?
- 7. なぜVaadinでVerticalLayoutの代わりにFormLayoutを使用しますか?
- 8. なぜ使用されるビューの代わりに、SQL文
- 9. ハッシュを削除するときに[]の代わりにa()を使用するのはなぜですか?
- 10. なぜ "new"を使用する代わりにCreateメソッドを使用するのですか?
- 11. なぜ代わりに+
- 12. dojoは、ダイアログ・アイコン「X」のアンカー・タグの代わりにスパンを使用するのはなぜですか?
- 13. Java 8のハッシュマップでリンクリストの代わりにバイナリツリーを使用するのはなぜですか?
- 14. urllib.request.urlretrieveの代わりに使用するコマンドは何ですか?
- 15. JRubyの代わりにRubyを使用することを検討しているのはなぜですか?
- 16. なぜboost :: ice_orを||の代わりに使うのですか? enable_ifの&&の代わりにboost :: ice_andを使用しますか?
- 17. (メタタグを使用して)リダイレクトする代わりにサーブレットページをリフレッシュ/リロードするのはなぜですか?
- 18. なぜbootstrapはdisplay:inline-blockの代わりに.spanで浮動小数点数を使用するのですか?
- 19. Xcode 4.2がNSAutoreleasePoolの代わりにmain.mで@autoreleasepoolを使用するのはなぜですか?
- 20. cocos2dで "CCCamera"の代わりに "CCFollow"を使用するのはなぜですか?
- 21. モデル空間の代わりにカメラ空間を法線に使用するのはなぜですか?
- 22. this.objectNameの代わりにExt.getCmp( 'id')を使用しなければならないのはなぜですか?
- 23. 「通常の」htmlの代わりにcontent_tagを使用するのはなぜですか?
- 24. sympyが `__init__`の代わりに` __new__`をオーバーライドするのはなぜですか?
- 25. JSONの代わりに[object Object]を取得するのはなぜですか?
- 26. なぜfopen()またはopen()がエラーコードを返す代わりにerrnoを使用するのですか?
- 27. なぜ文中の他の場所でも値が使用されない場合、i ++の代わりに++ iを使用するのはなぜですか?
- 28. なぜwindow.showModalDialogは推奨されていませんか?代わりに何を使用するのですか?
- 29. PHP 5がclassName()の代わりに__contruct()をコンストラクタとして使用するのはなぜですか?
- 30. C関数の代わりにポインタをパラメータとして使用するのはなぜですか?
「NDEBUG」は単に* no debug *を意味します。 'RELEASE'はもっと多くのことを意味するかもしれない。 – cnicutar
「デバッグ」/「デバッグしない」は、プログラミング環境のほとんどすべてに意味を持ちます。 "リリース"/"ソフトウェアのリリース"/"リリースの作成"は、コンパイラフラグを選択してからずっと前とは全く異なる会話です。 –
'#if defined(RELEASE)' '#define NDEBUG''#else'' #undef NDEBUG''#endif' – pmg