1

一部のアサーションはコストがかかり、一部は製品コードでオフにする方が適切です。少なくとも、アサーションを常に有効にする必要があることは明らかではありません。

私のアプリケーションでは、アサーションの一部をファイルごとまたはクラスごとにオン/オフできるようにしたいと考えています。

C ++でそれを行う方法は?

4

3 に答える 3

2

モジュール全体でアサートを非アクティブ化するには、次を使用します。

#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) {}.

于 2009-09-19T16:18:29.307 に答える
1

アサーションを使用してコーディングすることは、コーディングの適切なスタイルを考慮します。

ランタイムのオン/オフについては、ブール変数を使用して行うことができます。たとえば、コードでは次のことができます。

グローバル名前空間でアサーションがオンかオフかを示すために使用される変数を定義します(たとえば、同じファイル内のmain()関数から)。

bool  turnOnAssertions;

アサーションをオン/オフにする他のファイルで、以下に記述されているように変数を定義します。

extern bool turnOnAssertions; 

したがって、UIを使用してturnOnAssertions変数を操作し、次のように記述します。

if(turnOnAssertions)
assert(…);

一部のアサーションをオン/オフにすることができます!

コンパイル時については、次のことを行う必要があります。

コンパイラーの場合は、–DASSERTIONSON(-Dflag_name [任意に設定できるフラグ名])のようなフラグを指定する必要があります。

#ifdef ASSERTIONSON 
bool turnOnAssertions = true;
#else
bool turnOnAssertions = false;
#endif

そして、変数を使用するだけです。

幸運を!

于 2009-09-19T14:54:15.937 に答える
0

C ++ファイルのアサーションを無効にするには、次のいずれかを実行できます。

  • NDEBUGソースファイルの先頭近くに定数を定義します。
  • -DNDEBUGソースファイルのコンパイルオプションにを追加します。

ほとんどのIDEやビルドインフラストラクチャでは、ファイルごとにビルドオプションを指定できるため、これは簡単なソリューションです。

複数のクラスが同じソースファイルに混在している場合、またはヘッダーファイルに多くのインライン関数がある場合、クラスごとにアサーションをオフにすることはより困難です。もちろん、関連する場所で行うことができ#define NDEBUGます#undef NDEBUG

一部のIDEは、デバッグ以外のビルドを設定できることを期待しているためNDEBUG、などの独自のマクロ名を選択することで、より拡張性を高めることができますDISABLE_ASSERT。次に、次のようなコードを一般的なヘッダーファイル(プリコンパイルされていない)にインクルードします。

 #ifdef DISABLE_ASSERT
 #define NDEBUG
 #endif
于 2009-09-19T14:50:57.620 に答える