[boost] : asser库用法
基本用法
需要包含头文件#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库用法的更多相关文章
- boost::function的用法
本片文章主要介绍boost::function的用法. boost::function 就是一个函数的包装器(function wrapper),用来定义函数对象. 1. 介绍 Boost.Func ...
- UDF——处理二维网格的利器:Boost.Geometry库
本文编译工具:VC++ UDF Studio 该插件可以直接在Visual Studio中一键编译.加载.调试UDF源码,极大提高编写排错效率,且支持C++,MFC,Windows API和第三方库, ...
- 如何在WINDOWS下编译BOOST C++库 .
如何在WINDOWS下编译BOOST C++库 cheungmine 2008-6-25 写出来,怕自己以后忘记了,也为初学者参考.使用VC8.0和boost1.35.0. 1)下载boost ...
- Windows下如何使用BOOST C++库 .
Windows下如何使用BOOST C++库 我采用的是VC8.0和boost_1_35_0.自己重新编译boost当然可以,但是我使用了 http://www.boostpro.com/produc ...
- Boost线程库学习笔记
一.创建一个线程 创建线程 boost::thread myThread(threadFun); 需要注意的是:参数可以是函数对象或者函数指针.并且这个函数无参数,并返回void类型. 当一个thre ...
- Boost正则表达式库regex常用search和match示例 - 编程语言 - 开发者第2241727个问答
Boost正则表达式库regex常用search和match示例 - 编程语言 - 开发者第2241727个问答 Boost正则表达式库regex常用search和match示例 发表回复 Boo ...
- Boost::thread库的使用
阅读对象 本文假设读者有几下Skills [1]在C++中至少使用过一种多线程开发库,有Mutex和Lock的概念. [2]熟悉C++开发,在开发工具中,能够编译.设置boost::thread库. ...
- Anaconda下载及安装及查看安装的Python库用法
Anaconda下载及安装及查看安装的Python库用法 Anaconda 是一个用于科学计算的 Python 发行版,提供了包管理与环境管理的功能.Anaconda 利用 conda 来进行 pac ...
- 一起学习Boost标准库--Boost.StringAlgorithms库
概述 在未使用Boost库时,使用STL的std::string处理一些字符串时,总是不顺手,特别是当用了C#/Python等语言后trim/split总要封装一个方法来处理.如果没有形成自己的com ...
随机推荐
- 获取Oracle数据库awr报告方法
--登录数据库 sqlplus username/passwd; --运行生成AWR报告脚本 SQL> @?/rdbms/admin/awrrpt.sql; --输入要生成报告的格式:htm ...
- SQL Server 数据库获取架构信息
得到数据库存储过程列表: select * from dbo.sysobjects where OBJECTPROPERTY(id, N'IsProcedure') = 1 order by name ...
- 【剑指offer-12】矩阵中的路径
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- VPNl连接
2服务器IP端口及密码在QQ邮箱 OS Reload on localhost.localdomain [95.169.18.222] SSH port: 29657 69.194.13.216 ...
- sring 监听器
参考链接:http://blog.csdn.net/ysughw/article/details/8992322 sring容器在web程序中获取的方式:http://blog.csdn.net/aq ...
- <xsd:import>
最近研究wsdl文件发现在生成客户端代码时报错了, WSDLException (at /wsdl:definitions/wsdl:types/xsd:schema): faultCode=OTHE ...
- cocos2dx 不同平台上加载文件
原文转自:http://blog.sina.com.cn/s/blog_62b2318d0101eozt.html cocos2dx在不同平台上读取资源文件时的处理方式是不同的. 在ios下,程序调用 ...
- ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: N O) MYSQL
ERROR 1045 (28000): Access denied for user ODBC@localhost 刚使用mysql, 碰到这个问题.. C:\Program Files\MySQL\ ...
- git添加本地项目到git
1.切换到项目所在文件夹下:git int 2.git add -A 3.git commit -m '11' 4.git remote add origin https://github.com/g ...
- QAV250四轴穿越机安装全程详解(多图)
QAV250四轴穿越机安装全程详解 最近团队准备使用轻型穿越机QAV250做实验,本文记录了QAV250的安装过程,整理了开箱后较合理的安装顺序,以及各个步骤的注意事项,希望对有需要的朋友有所帮助.主 ...