最も明白なアプローチは、独自のバージョンの assert に独自の名前を付けることですassert()
。次に、テキストを検索したり、リンカ メッセージを調べたりして、リテラル文字列 "_assert" を探します。これを見れば、問題があることがわかります。
私自身のコードでAssert()
は、アサーションを実行する独自の関数に展開されるか((void)0)
、リリース ビルド用に展開される を常に使用します。コンパイラは((void)0)
式を何も変換しませんが、それでも式としてカウントされます。したがって
Assert(3 == x);
に変わります
((void)0);
セミコロンには場所があります。
ところで、アサートが特別な GUI モーダル ポップアップ ダイアログである GUI アプリケーションに取り組んだことがあります。3 つの選択肢がありました: 無視する、永久に無視する、または中断します。Ignore は、アサートを無視して実行を続けます。永遠に無視するとフラグが設定され、デバッガーでプログラムを再起動するまで、そのアサートはそれ以上発生しません。Break は、アサートがデバッガーに割り込むことを許可します。
各アサートに独自のフラグがあることをどのように保証したか覚えていません。Assert() 呼び出しを作成したときに、一意の整数を指定する必要があったのではないでしょうか? それがもっと自動化されていればいいのに。実際の実装はビットベクトルであり、永遠に無視を選択するとビットが設定されると確信しています。