便利な戦略の主張をチェック
-
11-09-2019 - |
質問
一部の主張は費用がかかるため、一部のように行って生産コードです。少なくとも明確ではないと主張すべきは常に有効になります。
アダプタのご使用をすればよいのでしょうかを見ることができたのでon/offの主張にしたりファイルまたはクラスです。
どうC++?
解決
非活性化のために、モジュール全体の私が使用したいをアサートします:
#if defined(assert)
# undef assert
# define assert(x) ((void)0)
#endif
...もちろんこれは、カスタムマクロを使用して大丈夫であれば簡略化することができます。
#if defined(_NO_ASSERTS)
# define myAssert(x) ((void)0)
#else
# define myAssert(x) assert(x)
#endif
クラス全体の非アクティブ化のために、私は、静的定数クラスのメンバーやカスタムマクロとの組み合わせで、クラス全体の列挙型を使用したいです
#define myAssert(x) do { if(_CLASS_ASSERT) { assert(x); } } while(0)
class AssertOff
{
enum { _CLASS_ASSERT = 0 }
}
列挙型と静的定数boolsを持つすべての近代的なコンパイラはif(_CLASS_ASSERT) {}
を離れて最適化する必要があります。
他のヒント
コードとの主張を考慮しいスタイルの符号といいます。
しのためにランタイム on/offできないたBooleanに変更します。例えば、コードで次の操作が可能です:
変数を定義しますことを示すのに使用する場合の主張されたかについてグローバル名前空間に(例えばのmain()関数と同じファイル).
bool turnOnAssertions;
変数を定義して以下のようなものその他のファイルがしたいのon/offのご主張:
extern bool turnOnAssertions;
で操作するturnOnAssertions変数のUI書
if(turnOnAssertions)
assert(…);
でon/offの一部で主張!
としてコンパイル時間 にするべきなの
まコンパイラするフラグのように–DASSERTIONSON(-Dflag_name[名フラグを設定できます。])
#ifdef ASSERTIONSON
bool turnOnAssertions = true;
#else
bool turnOnAssertions = false;
#endif
での使用を可変となります。
幸運を祈っています。
を無効主張のためのC++ファイルを、次のいずれかの操作を行います:
- を定義する
NDEBUG
常にソースファイルです。 - 追加の
-DNDEBUG
を編集するためのオプションのソースファイルです。
最Ideおよび/またはインフラの構築ができる指定オプションの構築はファイルです。
Offの主張りの基底クラスでは難しい複数のクラスが混入し、同じソースファイルで、多くのインライン機能を、ヘッダファイルです。もちろんの #define NDEBUG
や #undef NDEBUG
に関連する。
一部のIdeダウンロード出来るように設定 NDEBUG
非debugビルドから伸びにより、選択の自分のマクロ名など DISABLE_ASSERT
.そしてどのようにしているように共通のヘッダファイルなコンパイル済み):
#ifdef DISABLE_ASSERT
#define NDEBUG
#endif