金庆的专栏

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  423 随笔 :: 0 文章 :: 454 评论 :: 0 Trackbacks
用BOOST_ASSERT代替assert

(转载请注明来源于金庆的专栏)

断言assert()简单地输出错误信息并调用abort()退出是相当好用的功能.
错误信息包括文件名, 代码行, 及出错的表达式.
(如果能像Java, Python那样获取出错时的调用栈(traceback)就更好了,
可惜C++中好像无法得到调用栈?)

出于某些特殊的目的, 可以用BOOST_ASSERT()来代替assert().
BOOST_ASSERT()比assert()更灵活, (虽然也没有调用栈信息),
其基本的行为与assert()一致.

有两点扩展功能:

1. 可以定义BOOST_DISABLE_ASSERTS来停用BOOST_ASSERT().

assert通过定义NDEBUG来停用, 但是有时候想要发布一个调试版,
不能定义NDEBUG, 无法停用assert().
用BOOST_ASSERT()就多了一个控制选项, 即可以在调试版中停用断言.

2. 可以定义BOOST_ENABLE_ASSERT_HANDLER, 来调用自定义的断言出错函数.

如果定义了 BOOST_ENABLE_ASSERT_HANDLER,
BOOST_ASSERT 失败则调用 ::boost::assertion_failed().
如果未定义BOOST_ENABLE_ASSERT_HANDLER,则会调用标准的assert().

boost/assert.hpp中只声明了assertion_failed(), 需要自己定义.
它有4个参数, 分别是出错表达式串, 函数名, 文件名, 行号.

有了自定义的断言出错处理函数, 就可以实现断言出错时记录日志并续继执行.
(个人觉得这不是个好主意, 但被要求如此实现, 只好努力去满足).
绝妙的是, 可以通过宏来控制自己想要的断言行为.


posted on 2009-08-21 16:32 金庆 阅读(3444) 评论(3)  编辑 收藏 引用 所属分类: 1. C/C++

评论

# re: 用BOOST_ASSERT代替assert 2009-08-22 21:19 凡客
可以通过宏来控制自己想要的断言行为.  回复  更多评论
  

# re: 用BOOST_ASSERT代替assert[未登录] 2009-08-23 03:51 foxriver
多用assert也不太合适,特别是服务器程序,万一外挂来一个非法修改,你服务器端crc错误就弹一个assert,那就完了。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理