web-dev-qa-db-ja.com

(異なるプラットフォームで)NDEBUGプリプロセッサマクロは何に使用されますか?

さまざまなプラットフォーム/コンパイラ(「実装」)/フレームワークが[〜#〜] c [〜#〜]およびC++プリプロセッサマクロNDEBUGに割り当てる目的に興味があります。 。

[〜#〜] c [〜#〜]およびC++標準は、この定義を1回だけ言及しています。つまり、assert()マクロの動作を制御するためです。

特定のプラットフォーム/フレームワーク/ライブラリが[〜#〜] c [〜#〜]であることを知るまたは、C++はNDEBUG定義を使用して、他のものを有効または無効にします標準定義のassert()マクロに加えて

この質問をする理由の1つは、MS(Visual-C++)always(?)が "their"を使用することです _DEBUG デバッグとリリースを区別するために定義し、これがライブラリ/プラットフォームが「独自の」デバッグ定義を持つ一般的な慣行なのか、他のライブラリ/プラットフォームがNDEBUGを使用するのかデバッグ関連のもの。

36
Martin Ba

それは、問題のフレームワークのメンテナーまでの決定です。このような決定は変更される可能性があるため、何もする必要はありませんrely on。デバッグ関連のすべて(トレース出力など)のトグルとしてNDEBUGを使用していますが、次のリリースで気が変わるかもしれません。ここで誰も答えることができないのは、特定のプロジェクトで使用するフレームワークのAPIドキュメントを確認するための代替です。

そうは言っても、ライブラリ/フレームワークヘッダーでNDEBUGを使用する場合は、butassert()以外の場合は、かなり馬鹿げた設計決定になります。アプリケーションプログラマは明示的に NDEBUGを設定/設定解除できますが、ライブラリまたはフレームワークのヘッダーを含める前後に適切であると見なされるため、lib/frameworkメンテナはNDEBUGの設定に依存できませんリリースライブラリ用またはデバッグライブラリ用に設定されていません。重要なプロジェクトがNDEBUGにそのように依存していたとは思いません。

22
DevSolar

NDEBUGの唯一の「標準」なことは、assertマクロがチェックを実行するものに展開するかどうかを制御するために使用されることです。 MSVCは、プロジェクトで定義することにより、リリースビルド構成でこのマクロを便利に定義します。プロジェクト構成を編集して、手動で変更できます。他のツールチェーンも同様のことをする可能性があります(またはしない場合があります)。

NDEBUG#defineおよび/または#undefを使用して再インクルードし、再インクルード(ソースファイル)内のNDEBUGマクロの状態を変更することもできます。 assert.hは、assertマクロの動作を変更します(オンとオフを切り替えます)。その動作は標準によって義務付けられており、標準が標準ヘッダーを2回インクルードしてから2回目のインクルード後にコンパイルの動作を変更することを許可する唯一の時間です(私は思う)。

27
Michael Burr