web-dev-qa-db-ja.com

アサーションを完全に無効にする方法

assert(condition)の呼び出しでコードをいっぱいにしました。デバッグバージョンでは、アサーションを利用してg++ -gを使用します。驚いたことに、-gオプションなしでコンパイルされたリリースバージョンでもアサーションが動作しているのがわかります。

アサーションをコンパイル時に完全に無効にするにはどうすればよいですか?デバッグ、リリース、またはその他のものであっても、作成するビルドでNDEBUGを明示的に定義する必要がありますか?

絶対です #define NDEBUG(またはフラグ-DNDEBUG with g ++)これは、アサートヘッダーファイルを含める前に定義されている限り、アサートを無効にします。

88
GWW

#define NDEBUGを使用

7.2診断

1ヘッダーはassertマクロを定義し、別のマクロを参照します。

[〜#〜] ndebug [〜#〜]

<assert.h>で定義されていません。 [〜#〜] ndebug [〜#〜]が含まれるソースファイル内のポイントでマクロ名として定義されている場合、assert マクロは単純に次のように定義されます

#define assert(ignore) ((void)0)

assertマクロは、<assert.h>が実行されるたびに、[〜#〜] ndebug [〜#〜]の現在の状態に従って再定義されます。含まれています。

34
Prasoon Saurav

次の方法でアサーションを完全に無効にすることができます

#define NDEBUG
#include <assert.h>

または、生産バージョンと開発バージョンのどちらを使用するかに応じて、メイクファイル/ビルド手順でNDEBUGを(-DNDEBUGを介して)設定できます。

10
dcn

-gフラグはassertの動作に影響を与えません。さまざまなデバッグシンボルが利用できることを保証するだけです。

NDEBUGを設定することは、アサーションを無効にする標準的な方法(公式のISO標準)です。

10
Alnitak

はい、プリプロセッサ/コンパイラオプション-DNDEBUGを使用して、コマンドライン/ビルドシステムでNDEBUGを定義します。

これは、-gによって挿入されたデバッグ情報とは関係ありません。

4
Fred Foo