11

私のプログラムでは、エラー メッセージを表示するアサートを使用したいと考えています。C および C++ のよく知られた回避策とは別に、BOOST が提供する「本当の」解決策があります( assert() with messageBOOST_ASSERT_MSG( expr, msg )も参照してください) 。

しかし、静的メッセージだけでは十分ではありません。たとえば、次のような場合に、失敗した変数を表示したい場合もあります。

BOOST_ASSERT_MSG( length >= 0, "No positive length found! It is " << length )

ご覧のとおり、メッセージ "string" をstringstreamorostreamとしてフォーマットしたいと思います。これにより、カスタム タイプを簡単に表示できるようになります (関連するフォーマット関数を定義したと仮定します)。

ここでの問題BOOST_ASSERT_MSGは、デフォルトで が必要であるchar const *ため、互換性がないことです。

assertion_failed_msg()ストリームをメッセージとして使用できるように再定義/オーバーロードする方法はありますか? どのように?(コンパイラが最初にメッセージ自体で
実行したかったため、私の素朴なアプローチは失敗しました...)operator<<("foo",bar)

4

5 に答える 5

6

独自のマクロを定義できます

#define ASSERT_WITH_MSG(cond, msg) do \
{ if (!(cond)) { std::ostringstream str; str << msg; std::cerr << str.str(); std::abort(); } \
} while(0)
于 2012-08-12T13:06:57.637 に答える
6

これを達成するのは比較的簡単です。

BOOST_ASSERT_MSG( length >= 0, (std::stringstream() << "No positive length found! It is " << length).str().c_str() )
于 2012-08-12T13:09:28.620 に答える
1

BOOST_ASSERT_MSG複数の assert メッセージを指定することがoperator<<複雑にならないように、独自のラッパーを使用して を使用します。

#if defined ASSERT_ENABLED 

    #define ASSERT(cond, msg) {\
        if(!(cond))\
        {\
            std::stringstream str;\
            str << msg;\
            BOOST_ASSERT_MSG(cond, str.str().c_str());\
        }\
    }
#else
    #define ASSERT(...) 
#endif

使用例、あなたが出力しているようなカスタムメッセージを提供しますcout:

  ASSERT(execSize == (_oldSize - remaining), "execSize : " << execSize << ", _oldSize : " << _oldSize << ", remaining : " << remaining);

が定義されている場合ASSERT_ENABLEDは、アサーション メッセージを有効にします。一部は最適化でありif(!(cond))、マクロ パラメータmsgで指定されたコストのかかる文字列操作を回避します。condtrue

于 2016-02-20T14:00:28.400 に答える