私のプログラムでは、エラーメッセージを表示するアサーションを使用したいと思います。 CとC++のよく知られている回避策の他に、BOOSTが提供する「本当の」解決策がありますBOOST_ASSERT_MSG(expr, msg)
(assert() with messageも参照してください)動的メッセージでアサートしますか?
しかし、静的メッセージでは不十分です。例えば
BOOST_ASSERT_MSG(length >= 0, "No positive length found! It is " << length)
ような場合には、あなたはそれが私が関連を定義したと仮定すると(私は簡単にカスタムタイプを表示できるようにするだろうと私はstringstream
またはostream
としてメッセージ「文字列」をフォーマットしたいのですが見ることができるようにフォーミング機能)。
ここで問題となるのは、BOOST_ASSERT_MSG
はデフォルトでchar const *
であるため、互換性がありません。
assertion_failed_msg()
をメッセージとしてストリームを使用するように再定義/オーバーロードする方法はありますか?どうやって?
(コンパイラは最初のメッセージ自体にoperator<<("foo",bar)
をやってみたかったと私の単純なアプローチが失敗した...)
なぜ ''(0)、一方であれば
if(!(cond))
部分は、マクロパラメータmsg
によって指定された高価な文字列操作を回避する最適化、ですか? – WiSaGaNhttp://stackoverflow.com/questions/1067226/c-multi-line-macro-do-while0-vs-scope-block – Greg
'while(0)'を使用する場合は、 ';'を省略してください。 –