基本用法

需要包含头文件#include <boost/assert.hpp>

assert库定义了两个断言宏

BOOST_ASSERT
BOOSE_ASSERT_MSG

第一种形式等价于assert宏, 断言表达式为真. 第二种形式允许断言失败是输出描述性字符串用于排错.

BOOST_ASSERT宏只在debug模式下生效, 在release模式下不会编译, 不会影响运行效率.

#include <iostream>
#include <cstring>
#include <boost/assert.hpp>
using namespace std; double func(int x)
{
BOOST_ASSERT_MSG(x != 0, "divided by zero");
return 1.0 / x;
} void case1()
{
BOOST_ASSERT(16 == 0x10); // 断言成立
// BOOST_ASSERT(string().size() == 1); // 断言失败, 抛出异常 // func(0); // 导致断言失败, 抛出异常 int len;
BOOST_ASSERT(len = strlen("123"));
assert(len == 3);
} int main()
{
case1();
return 0;
}

BOOST_ASSERT(string().size() == 1);断言失败会输出一下信息:

assert.cpp:15: void case1(): Assertion `string().size() == 1' failed.

func(0)导致断言失败会输出以下信息:

assert.cpp:8: double func(int): Assertion `(x != 0)&&("divided by zero")' failed.

禁用断言

如果在头文件<boost/assert.hpp>之前定义宏BOOST_DISABLE_ASSERT会导致BOOST_ASSERT自动失效, 但标准的assert宏不受影响

#define BOOST_DISABLE_ASSERT
#include <boost/assert.hpp> double func2(int x)
{
BOOST_ASSERT(x != 0 && "divided by zero"); // 失效
cout << "after BOOST_ASSERT" << endl; assert(x != 0 && "divided by zero"); // 有效
cout << "after" << endl; return 1.0 / x;
}

扩展用法

如果在头文件<boost/assert.hpp>之前定义宏BOOST_ENABLE_ASSERT_HANDLER, 将不再等同于assert宏, 断言表达式无论在debug还是release模式都将被求值, 如果断言失败自动调用assertion_failed()或者assertion_failed_msg(), 这相当于提供一个错误处理hanlder.

注意: 用户必须实现assertion_failed()函数和assertion_failed_msg().

#include <iostream>
#include <cstring>
#include <boost/format.hpp> #define BOOST_ENABLE_ASSERT_HANDLER
#include <boost/assert.hpp>
using namespace std; double func(int x)
{
BOOST_ASSERT_MSG(x != 0, "divided by zero");
return 1.0 / x;
} 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;
}
} int main()
{
func(0);
return 0;
}

断言失败输出:

Assertion failed!
Expression: x != 0
Function: double func(int)
File: assert.cpp
Line: 11
Msg: divided by zero

[boost] : asser库用法的更多相关文章

  1. boost::function的用法

    本片文章主要介绍boost::function的用法. boost::function 就是一个函数的包装器(function wrapper),用来定义函数对象. 1.  介绍 Boost.Func ...

  2. UDF——处理二维网格的利器:Boost.Geometry库

    本文编译工具:VC++ UDF Studio 该插件可以直接在Visual Studio中一键编译.加载.调试UDF源码,极大提高编写排错效率,且支持C++,MFC,Windows API和第三方库, ...

  3. 如何在WINDOWS下编译BOOST C++库 .

    如何在WINDOWS下编译BOOST C++库 cheungmine 2008-6-25   写出来,怕自己以后忘记了,也为初学者参考.使用VC8.0和boost1.35.0.   1)下载boost ...

  4. Windows下如何使用BOOST C++库 .

    Windows下如何使用BOOST C++库 我采用的是VC8.0和boost_1_35_0.自己重新编译boost当然可以,但是我使用了 http://www.boostpro.com/produc ...

  5. Boost线程库学习笔记

    一.创建一个线程 创建线程 boost::thread myThread(threadFun); 需要注意的是:参数可以是函数对象或者函数指针.并且这个函数无参数,并返回void类型. 当一个thre ...

  6. Boost正则表达式库regex常用search和match示例 - 编程语言 - 开发者第2241727个问答

    Boost正则表达式库regex常用search和match示例 - 编程语言 - 开发者第2241727个问答 Boost正则表达式库regex常用search和match示例 发表回复   Boo ...

  7. Boost::thread库的使用

    阅读对象 本文假设读者有几下Skills [1]在C++中至少使用过一种多线程开发库,有Mutex和Lock的概念. [2]熟悉C++开发,在开发工具中,能够编译.设置boost::thread库. ...

  8. Anaconda下载及安装及查看安装的Python库用法

    Anaconda下载及安装及查看安装的Python库用法 Anaconda 是一个用于科学计算的 Python 发行版,提供了包管理与环境管理的功能.Anaconda 利用 conda 来进行 pac ...

  9. 一起学习Boost标准库--Boost.StringAlgorithms库

    概述 在未使用Boost库时,使用STL的std::string处理一些字符串时,总是不顺手,特别是当用了C#/Python等语言后trim/split总要封装一个方法来处理.如果没有形成自己的com ...

随机推荐

  1. forget word out a~4

    1● ana 错误,分开   2● ante   先,前面   3● anti 反对,相反       1◆ ana 2◆ ante 3◆ anti     1● dem(o) 2● pupl 3● ...

  2. Mysql 分区表-分区操作

    一.查看MySQL是否支持分区 1.MySQL5.6以及之前版本 show variables like '%partition%'; 2.MySQL5.7 show plugins; 二.分区表的分 ...

  3. Java——线程池

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  4. 2.3 C++类的信息隐藏机制 -- 封装

    参考:http://www.weixueyuan.net/view/6335.html 总结: private.protected和public  限制类中声明的变量和函数在外部的访问权限. 声明为p ...

  5. 内核事件KEVENT(同步)

    转载请您注明出处:http://www.cnblogs.com/lsh123/p/7358702.html 一.驱动程序与驱动程序的事件交互    IoCreateNotificationEvent ...

  6. DevExpress v17.2新版亮点—WinForms篇(一)

    用户界面套包DevExpress v17.2终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.开篇介绍了DevExpress WinForms v17.2 Data Grid Control ...

  7. beta阶段贡献分配实施

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2281] 要求1 每位组员的贡献分值   刘莹莹 王玉潘 潘世维 周昊 赵美增 ...

  8. cocos2d-x移植:xcode到eclipse

    xcode程序移植到eclipse 必要组件: 1.macos gcc编译器,若没有,在xcode->preference->downloads中下载command line tools( ...

  9. DialogFragment详解

    详解一: Android提供alert.prompt.pick-list,单选.多选,progress.time-picker和date-picker对话框,并提供自定义的dialog.在Androi ...

  10. macOS 使用brew安装mysql,客户端连接不上

    macos 使用brew安装mysql8.0后,使用mysql官方的workbench连接不上,出现√ mysql8.0 Authentication plugin 'caching_sha2_pas ...