一部のアサーションはコストがかかり、一部は製品コードでオフにする方が適切です。少なくとも、アサーションを常に有効にする必要があることは明らかではありません。
私のアプリケーションでは、アサーションの一部をファイルごとまたはクラスごとにオン/オフできるようにしたいと考えています。
C ++でそれを行う方法は?
一部のアサーションはコストがかかり、一部は製品コードでオフにする方が適切です。少なくとも、アサーションを常に有効にする必要があることは明らかではありません。
私のアプリケーションでは、アサーションの一部をファイルごとまたはクラスごとにオン/オフできるようにしたいと考えています。
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
クラス全体の非アクティブ化の場合、静的 const クラス メンバーまたはクラス全体の列挙型をカスタム マクロと組み合わせて使用します。
#define myAssert(x) do { if(_CLASS_ASSERT) { assert(x); } } while(0)
class AssertOff
{
enum { _CLASS_ASSERT = 0 }
}
enum と static const bool を使用すると、最新のコンパイラはすべて最適化してif(_CLASS_ASSERT) {}
.
アサーションを使用してコーディングすることは、コーディングの適切なスタイルを考慮します。
ランタイムのオン/オフについては、ブール変数を使用して行うことができます。たとえば、コードでは次のことができます。
グローバル名前空間でアサーションがオンかオフかを示すために使用される変数を定義します(たとえば、同じファイル内のmain()関数から)。
bool turnOnAssertions;
アサーションをオン/オフにする他のファイルで、以下に記述されているように変数を定義します。
extern bool turnOnAssertions;
したがって、UIを使用してturnOnAssertions変数を操作し、次のように記述します。
if(turnOnAssertions)
assert(…);
一部のアサーションをオン/オフにすることができます!
コンパイル時については、次のことを行う必要があります。
コンパイラーの場合は、–DASSERTIONSON(-Dflag_name [任意に設定できるフラグ名])のようなフラグを指定する必要があります。
#ifdef ASSERTIONSON
bool turnOnAssertions = true;
#else
bool turnOnAssertions = false;
#endif
そして、変数を使用するだけです。
幸運を!
C ++ファイルのアサーションを無効にするには、次のいずれかを実行できます。
NDEBUG
ソースファイルの先頭近くに定数を定義します。-DNDEBUG
ソースファイルのコンパイルオプションにを追加します。ほとんどのIDEやビルドインフラストラクチャでは、ファイルごとにビルドオプションを指定できるため、これは簡単なソリューションです。
複数のクラスが同じソースファイルに混在している場合、またはヘッダーファイルに多くのインライン関数がある場合、クラスごとにアサーションをオフにすることはより困難です。もちろん、関連する場所で行うことができ#define NDEBUG
ます#undef NDEBUG
。
一部のIDEは、デバッグ以外のビルドを設定できることを期待しているためNDEBUG
、などの独自のマクロ名を選択することで、より拡張性を高めることができますDISABLE_ASSERT
。次に、次のようなコードを一般的なヘッダーファイル(プリコンパイルされていない)にインクルードします。
#ifdef DISABLE_ASSERT
#define NDEBUG
#endif