boost - 断言

  • 标准assert宏的原型声明在<assert.h>中,其作用是如果它的测试条件为假,则调用abort()终止程序执行,程序退出的时候会弹出一个错误提示框,并向控制台输出所在文件及行号。

  • assert()只针对debug版本,在Release版本中assert()是无效的。

使用建议:

  • 每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败。
  • 比如Object* p = new Object,返回空指针
  • 所以,大的原则可以是这样:内部函数尽量简化容错机制,稍微苛刻一些,而对外接口则尽量容忍,出错处理也要温柔。
  • 断言不应该以任何方式改变程序的状态。简单的说,如果希望在不满足某些条件时阻止代码的执行,就可以考虑用断言来阻止它。

简易使用:

BOOST_ASSERT_MSG(false,"assert msg");

boost - 扩展:

boost中的BOOST_ASSERT有两点扩展功能:

  1. 可以通过定义BOOST_DISABLE_ASSERTS使在debug版本中也能停用BOOST_ASSERT()。
  2. 可以通过定义BOOST_ENABLE_ASSERT_HANDLER使断言出错的时候调用自定义的函数:
    • 如果定义了 BOOST_ENABLE_ASSERT_HANDLER,
      • BOOST_ASSERT失败则会调用::boost::assertion_failed(),
      • boost / assert.hpp中只声明了assertion_failed(), 可以自己定义它,
      • 它有4个参数, 分别是出错表达式串, 函数名, 文件名, 行号。
    • 如果未定义BOOST_ENABLE_ASSERT_HANDLER,则会调用标准的assert().

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;
}