对比C++标准库中的assert,Boost.assert强化了原始的运行时assert宏,static_assert库提供了静态断言(编译期诊断),而lightweight_test和test库则构建了完整的单元测试框架。
这里写的是运行时assert宏
基本用法
assert库定义了两个断言宏
#define BOOST_ASSERT(expr) assert(expr)
#define BOOST_ASSERT_MSG(expr, msg) assert((expr) && (msg))
对于第一种BOOST_ASSERT和标准库中的assert一样,第二种形式则允许断言失败时输出描述性字符串(msg)。
例如:
#include <boost/assert.hpp>
int main()
{
int a = 10;
BOOST_ASSERT(a == 10);
BOOST_ASSERT_MSG(a != 10, "a is equal to 10"); // 断言为假,输出 "a is equal to 10"
return 0;
}
禁止断言
在文件开头定义BOOST_DISABLE_ASSERTS会禁用boost.assert库,而标准的assert宏不会受到影响。
例如:
#define BOOST_DISABLE_ASSERTS
#include <boost/assert.hpp>
int main()
{
int a = 10;
// 下面两个将会失效
BOOST_ASSERT(a == 10);
BOOST_ASSERT_MSG(a != 10, "a is equal to 10");
return 0;
}
拓展用法
这是我觉得最有用的一种用法。如果断言失败,会发生一个断言失败的函数调用boost::assertion_failed()或者assertion_failed_msg()相当于提供了一个错误处理handler。可以在boost名称空间里重新自定义这两个函数。
namespace boost
{
void assertion_failed(char const* expr, char const* function, char const* file, long line);
void assertion_failed_msg(char const* expr, char const* msg, char const* function, char const* file, long line);
}
参数:
1. expr – 是断言的表达式
2. function – 断言所在的函数
3. file – 文件路径
4. line – 错误代码的行号
5. msg – 错误提示信息(BOOST_ASSERT_MSG所用)
例如:
#define BOOST_ENABLE_ASSERT_HANDLER // 启用handler
#include <iostream>
#include <boost/assert.hpp>
#include <boost/format.hpp>
using namespace std;
namespace boost
{
void assertion_failed(char const*, char const*, char const*, long) {}
void assertion_failed_msg(char const* expr, char const* msg, char const* function,
char const* file, long line)
{
boost::format fmt("Assertion failed\nExpression: %s\n"
"Function: %s\nFile: %s\nLine: %ld\n"
"Msg: %s\n\n");
fmt % expr % function % file % line % msg;
cout << fmt;
}
}
double func(int x)
{
BOOST_ASSERT_MSG(x != 0, "divided by zero");
return 1.0 / x;
}
int main(int argc, char const *argv[])
{
func(0);
return 0;
}
运行结果: