在我的程序中,我想使用显示错误消息的断言。除了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)
...)
为什么'while(0)'?是最优化的,它避免了宏参数
msg
指定的代价昂贵的字符串操作。 – WiSaGaN 2012-08-12 13:08:39请参阅http://stackoverflow.com/questions/1067226/c-multi-line-macro-do-while0-vs-scope-block – Greg 2012-08-12 13:10:04
如果使用'while(0)',则省略';'。 – 2012-08-12 13:42:00