boost - 断言
-
标准assert宏的原型声明在<assert.h>中,其作用是如果它的测试条件为假,则调用abort()终止程序执行,程序退出的时候会弹出一个错误提示框,并向控制台输出所在文件及行号。
-
assert()只针对debug版本,在Release版本中assert()是无效的。
使用建议:
- 每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败。
- 比如Object* p = new Object,返回空指针
- 所以,大的原则可以是这样:内部函数尽量简化容错机制,稍微苛刻一些,而对外接口则尽量容忍,出错处理也要温柔。
- 断言不应该以任何方式改变程序的状态。简单的说,如果希望在不满足某些条件时阻止代码的执行,就可以考虑用断言来阻止它。
简易使用:
BOOST_ASSERT_MSG(false,"assert msg");
boost - 扩展:
boost中的BOOST_ASSERT有两点扩展功能:
- 可以通过定义BOOST_DISABLE_ASSERTS使在debug版本中也能停用BOOST_ASSERT()。
- 可以通过定义BOOST_ENABLE_ASSERT_HANDLER使断言出错的时候调用自定义的函数:
- 如果定义了 BOOST_ENABLE_ASSERT_HANDLER,
- BOOST_ASSERT失败则会调用::boost::assertion_failed(),
- boost / assert.hpp中只声明了assertion_failed(), 可以自己定义它,
- 它有4个参数, 分别是出错表达式串, 函数名, 文件名, 行号。
- 如果未定义BOOST_ENABLE_ASSERT_HANDLER,则会调用标准的assert().
- 如果定义了 BOOST_ENABLE_ASSERT_HANDLER,
eg:
#define BOOST_ENABLE_ASSERT_HANDLER
#include "boost/assert.hpp"
namespace boost
{
void assertion_failed(char const * expr, char const * function,
char const * file, long line)
{
//todo
}
}
int main()
{
BOOST_ASSERT(false);
return 0;
}