boost中assert.hpp

BOOST_ASSERT用法详解及示例代码 总结一下,BOOST_ASSERT是Boost库提供的一个宏,用于在运行时检查表达式的真假。如果expression为false,则BOOST_ASSERT宏将触发断言失败,并在标准错误流中输出一条错误消息。在软件开发中,错误的假设和断言往往是导致程序错误和异常的主要原因之一。因此,BOOST_ASSERT将触发断言失败,并输出相应的错误消息。在上面的示例中,我们定义了BOOST_DISABLE_ASSERTS宏,并在包含boost/assert.hpp之前进行了定义。这将完全禁用所有断言。 阅读详情

assert.hpp

BOOST_ASSERT
BOOST_ASSERT_MSG
BOOST_VERIFY
BOOST_VERIFY_MSG
BOOST_ASSERT_IS_VOID

BOOST_ASSERT

头文件 <boost/assert.hpp> 定义了宏指令(macro)BOOST_ASSERT,它和<cassert>中定义的标准宏指令类似。

  • 默认情况,BOOST_ASSERT(expr)等同于 assert(expr)
  • 若在引入<boost/assert.hpp>时 BOOST_DISABLE_ASSERTS 被定义,BOOST_ASSERT(expr) 等于是 ((void)0),而不管NDEBUG 是否已经被定义。这样允许用户在禁用BOOST_ASSERT 时不会影响标准assert的定义。
  • 若定义了BOOST_ENABLE_ASSERT_HANDLER当引入<boost/assert.hpp>时,BOOST_ASSERT(expr)等价于:
(BOOST_LIKELY(!!(expr))? ((void)0): ::boost::assertion_failed(#expr, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__))

     上面的代码表示判定expr是否为真,若为真,则调用::boost::assertion_failed(#expr, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__)。 这个与NDEBUG是否定义无关。

boost::assertion_failed 在 <boost/assert.hpp> 中定义如下:

namespace boost
{
  void assertion_failed(char const * expr, char const * function, char const * file, long line);
}

但是上述从不自己定义,而是由用户需要提供适当的定义。

  • 若BOOST_ENABLE_ASSERT_DEBUG_HANDLER 定义时也引入了<boost/assert.hpp>,在NDEBUG 也定义时,BOOST_ASSERT(expr) 等价于((void)0)。

与<cassert>一样,<boost/assert.hpp>可以在单个translation unit中包含多次。每次按上述规定重新定义boost断言

BOOST_ASSERT_MSG

BOOST_ASSERT_MSG 和BOOST_ASSERT类似,但多了一个额外的字符串字面值,用来显示错误信息。

  • BOOST_ASSERT_MSG 默认是 assert((expr)&&(msg))等价于assert((expr)&&(msg))。
  • 当引入 <boost/assert.hpp> 时若BOOST_DISABLE_ASSERTS 被定义了,则无论宏ndebug是否定义,BOOST_ASSERT_MSG(expr,msg)都相当于 ((void)0),
  • 当引入 <boost/assert.hpp> 时若BOOST_ENABLE_ASSERT_HANDLER 被定义了,BOOST_ASSERT_MSG(expr,msg) 等价于:
(BOOST_LIKELY(!!(expr))? ((void)0): ::boost::assertion_failed_msg(#expr, msg, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__))

此时,与NDEBUG 是否定义无关。

<boost/assert.hpp>中boost::assertion_failed_msg定义如下:

namespace boost
{
  void assertion_failed_msg(char const * expr, char const * msg, char const * function, char const * file, long line);
}

but it is never defined. The user is expected to supply an appropriate definition.

  • 当引入<boost/assert.hpp>时若 定义了BOOST_ENABLE_ASSERT_DEBUG_HANDLER ,BOOST_ASSERT_MSG(expr)在NDEBUG 定义时就相当于((void)0) 

和<cassert>一样, <boost/assert.hpp> 也可以被引入(included)多次在a single translation unit. 

boost_assert_msg将按上述规定每次重新定义。

BOOST_VERIFY

宏boost_verify与boost_assert具有相同的行为,只是传递给boost_verify的表达式总是被计算出来的。当断言表达式具有理想的副作用时,这是有用的;当变量的唯一使用是在断言中时,它还可以帮助抑制有关未使用变量的警告。

  • 当引入<boost/assert.hpp>时若定义了 BOOST_DISABLE_ASSERTS ,BOOST_VERIFY(expr) expands to ((void)(expr)).
  • 当引入<boost/assert.hpp>时若定义了 BOOST_ENABLE_ASSERT_HANDLER , BOOST_VERIFY(expr)等价于 BOOST_ASSERT(expr).
  • 否则,当NDEBUG 定义时, BOOST_VERIFY(expr)相当于 ((void)(expr));NDEBUG 未定义时,它相当于BOOST_ASSERT(expr)。

BOOST_VERIFY_MSG

 BOOST_VERIFY_MSG类似于 BOOST_VERIFY,也只是多了一个错误提示信息的参数。

  • 当引入<boost/assert.hpp>时若 定义了BOOST_DISABLE_ASSERTS,BOOST_VERIFY_MSG(expr,msg) 等价于 ((void)(expr)).
  • 当引入<boost/assert.hpp>时若 定义了BOOST_ENABLE_ASSERT_HANDLER ,BOOST_VERIFY_MSG(expr,msg) 等价于 BOOST_ASSERT_MSG(expr,msg).
  • 否则, 当定义了NDEBUG 时 BOOST_VERIFY_MSG(expr,msg)等价于 ((void)(expr)) ;若未定义NDEBUG ,它相当于BOOST_ASSERT_MSG(expr,msg) 。

BOOST_ASSERT_IS_VOID

宏boost_assert_is_void是在boost_assert和boost_assert_msg被定义时,等价于((void)0)。此宏有助于避免编译和可能运行仅用于准备断言中使用的数据的代码。

void MyContainer::erase(iterator i)
{
  //Some sanity checks, data must be ordered
  #ifndef BOOST_ASSERT_IS_VOID
     if(i != c.begin()){
        iterator prev = i;
        --prev;
        BOOST_ASSERT(*prev < *i);
     }
     else if(i != c.end()){
        iterator next = i;
        ++next;
        BOOST_ASSERT(*i < *next);
     }
  #endif
  this->erase_impl(i);
}
  • 默认情况下,如果定义了ndebug,则会定义boost_assert_is_void。
  • 如果宏boost_disable_断言已定义,则始终定义boost_assert_is_void。
  • 如果宏boost_enable_assert_handler已定义,则不会定义boost_assert_is_void。
  • 如果宏boost_enable_assert_debug处理程序,则在定义ndebug时定义boost_assert_is_void。

 

参考:

【1】 https://www.boost.org/doc/libs/1_61_0/libs/assert/assert.html#BOOST_ASSERT_MSG

Boost:BOOST_ASSERT扩展的使用详解 BOOST_ASSERT_REQUIRE 宏定义与 BOOST_ASSERT 宏定义一样,当 expr 为假时,会输出错误信息和表达式值,并终止程序运行。但是,相比于 BOOST_ASSERT 宏定义,BOOST_ASSERT_REQUIRE 宏定义更加严格,若编译器开启了 assert 的 NDEBUG 标记,BOOST_ASSERT_REQUIRE 宏定义会直接结束程序运行,无论 NDEBUG 标记是否开启。通过本文的介绍,相信大家对 BOOST_ASSERT 的使用和扩展已经有了更深入的了解。 阅读详情

相关推荐

测试boost::mpl模块AUX_ASSERT_IS_SEQ的程序

在 test_is_seq 结构体模板中,我们使用了 BOOST_MPL_ASSERT_MSG 宏来检查 Seq 是否是一个序列类型。如果 Seq 不是序列类型,会输出一条错误信息 Seq_is_not_a_sequence_type。其中,BOOST_MPL_AUX_IS_SEQ_TYPEDEF_ 是一个辅助 typedef 宏,在 BOOST_MPL_ASSERT_MSG 宏中使用。测试boost::mpl模块AUX_ASSERT_IS_SEQ的程序。

BUG?不存在的! 115

boost/mpl/assert.hpp:189:21: error: unnecessary parentheses in declaration of ‘assert_arg‘ [-Werror=

BOOST报错: boost/mpl/assert.hpp:189:21: error: unnecessary parentheses in declaration of 'assert_arg' [-Werror=parentheses] 189 | failed ************ (Pred::************ | ^ ./_Lib3rd/boost/mpl/assert.hpp:194:21: error: unnecessa...

VT——csj 3984

Boost库中的ASSERT_IS_VOID测试程序

其中一个非常有用的工具是ASSERT_IS_VOID宏,它可以帮助我们进行调试,并在程序运行错误时打印出相应的错误信息。在这个程序中,我们将x与20进行比较,由于它们不相等,所以expression返回false,程序会抛出一个assertion_failed异常并退出。通过使用ASSERT_IS_VOID宏,我们可以轻松地进行调试,并快速找到程序中的错误。以上就是关于Boost库中ASSERT_IS_VOID的测试程序的介绍和示例代码,如果您对此有任何疑问或建议,欢迎在下方留言区与我们交流。

TechChamp的博客 128

C++之boost库报错:note: in expansion of macro BOOST_MPL_ASSERT_NOT(八十六)

1.下载编译、安装boost1.55版本 https://sourceforge.net/projects/boost/files/boost/1.55.0 解压编译 # ./b2 # cmake -DCMAKE_CXX_FLAGS="-Wno-error=old-style-cast" Or 在test.cmake添加 set(CMAKE_CXX_FLAGS "-Wno-error=old-style-cast")

Android系统攻城狮 4726

RISC-V内核移植实战:从零开始手把手实现RT-Thread上下文切换(附GD32VF103代码解析)

本文详细解析了在RISC-V架构上移植RT-Thread实时操作系统的核心步骤,重点聚焦于上下文切换机制的实现。通过对比ARM Cortex-M与RISC-V在中断处理和寄存器管理上的关键差异,并以GD32VF103开发板为例,手把手指导开发者完成libcpu抽象层适配、线程栈初始化以及三种上下文切换方式的代码编写与调试,为嵌入式开发者从ARM转向RISC-V平台提供了实战指南。

fern8的博客 739

网络变压器等效电路及网络变压器中间抽头作用详解

       华强盛电子导读:要详细了解网络变压器周边EMC管控及网络变压器BOB-SMITH电路的连接原理,首先我们对网络变压器的认识及其电路各参数影响都要有个简要的认识,本文,对非理想网络变压器等效电路做一个详细的分析,其中重点讨论一下网络变压器中间抽头的作用其影响                          网络变压器等效电路及                        ...

网络变压器专业资料 6005

Boost源码剖析--<boost/assert.hpp>

Boost源码剖析--boost/assert.hpp> By 马冬亮(凝霜  Loki) 一个人的战争(http://blog.csdn.net/MDL13412) 头文件:         定位:         BOOST_ASSERT类似于标准库中的assert(定义在),目的是在Boost库和用户代码中都可以使用。 分析:         默认情况下BOOST_

一个人的战争 6471

学习心得——COMSOL Multiphysics with MATLAB联合仿真及寻优计算

学习心得——COMSOL Multiphysics with MATLAB联合仿真及寻优计算

weixin_41678956的博客 8658

centos7.2离线编译安装boost1.5.9

centos7.2编译安装boost1.5.9 编译前的环境准备: 准备安装包boost_1_59_0.tar.gz,gcc9.3.1。安装包下载地址为:链接:https://pan.baidu.com/s/1r4cnCjDzQIS83RimDl89og 提取码:gccb 复制这段内容后打开百度网盘手机App,操作更方便哦--来自百度网盘超级会员V3的分享 gcc9.3.1的启用。 准备本...

zsk_john的技术分享专用博客 1159

FortiClient EMS实战:从安装到配置的全流程优化指南

本文详细解析了FortiClient EMS 7.0版本的部署与优化全流程,帮助企业构建零信任终端安全体系。从环境规划、高效安装、终端纳管到高级运维,提供实战指南和优化技巧,特别适用于Windows Server环境,助力企业提升终端安全管理效率。

weixin_29325007的博客 548

rk3576 适配摄像头 (mipi 五摄)

在RK3576上实现五路CSI摄像头方案,核心思路是充分复用其视频输入接口,并通过巧妙的软件配置来实现。

weixin_35723192的博客 178

Boost.Test ASSERT断言用法

使用文件 包含头文件即可:assert.hpp 主要就是5个断言: BOOST_ASSERT BOOST_ASSERT_MSG BOOST_VERIFY BOOST_VERIFY_MSG BOOST_ASSERT_IS_VOID 官方文档: BOOST_ASSERTBOOST_ASSERT_MSGBOOST_VERIFYBOOST_VERIFY_MSGBOOST_ASSERT_IS_VOI...

weixin_30675247的博客 237

OpenCV实现文档扫描OCR识别(基于Python + OpenCV,含完整代码)

在当今数字化时代,文档处理的自动化需求日益增长。文档扫描OCR(Optical Character Recognition,光学字符识别)技术成为了将纸质文档转换为可编辑电子文本的关键手段。通过Python与OpenCV库的结合,我们能够实现高效、准确的文档扫描OCR识别。这一技术在办公自动化、数字图书馆、档案管理等众多领域都有着广泛的应用。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2031

改写boost库中assert实现方式

中定义了BOOST_ASSERT宏,这个宏在多个库中被使用,如智能指针。BOOST_ASSERT默认使用各平台assert.h中定义的assert宏。这在很多时候不是很爽。不过还好boost设计时已经考虑到这点,所以可以很简单地改写这种行为。     直接代码说话,不过二十多行 ==========================================================

runyon的博客 372

08 RK3568 MAC TO MAC直连 RTL8367S mdio

本文:采用rk3568 gamc0 通过rgmii直连 交换芯片的mac口 通信方法为mdio。

qq_39451352的博客 3475

10、犹豫双模糊TOPSIS算法:原理与实例解析

本文介绍了犹豫双模糊TOPSIS算法的基本原理与应用步骤,结合中国四家纺织公司的案例,详细解析了从构建犹豫双模糊决策矩阵、归一化处理、专家信息聚合,到确定正负理想解、计算距离与相对贴近度系数的完整决策流程。该方法有效应对决策者在评价过程中的犹豫性,适用于财务评估、项目选择等复杂多属性决策场景,具有较强的实用性和推广价值。

yhn45678901的博客 122

Boost.StaticAssert

                       Boost.StaticAssertboost/static_assert.hppTable of ContentsOverview and TutorialUse at namespace scope.Use at function scopeUse at class scope

※※※quyanbao的专栏※※※ 1296

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

boost.assert库 static_assert

boost.assert库增强了原始的运行时assert宏,static_assert库提供了静态断 言(编译器诊断) 使用boost.assert库需要包含头文件 BOOST_ASSERT宏:在debug模式下生效,release模式下不会进行编译 用法:   禁用断言:可以有选择的关闭BOOST_ASSERT   BOOST_DISABLE_ASSERTS      #d

晴天的专栏 1731

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

用BOOST_ASSERT代替assert

用BOOST_ASSERT代替assert(转载请注明来源于金庆的专栏)断言assert()简单地输出错误信息并调用abort()退出是相当好用的功能.错误信息包括文件名, 代码行, 及出错的表达式.(如果能像Java, Python那样获取出错时的调用栈(traceback)就更好了,可惜C++中好像无法得到调用栈?)出于某些特殊的目的, 可以用BOOST_A

金庆的专栏 4375

C++“准”标准库Boost学习指南(3):Boost.Utility

Boost.Utility 一些本不应在一个库里出现的有用的东西,只是因为它们每个都不太复杂和广泛,不足够形成一个单独的库。但不是说它们没有什么用外;事实上小的工具通常都有最广泛的用处。在Boost, 这些小工具被集中起来,形成一个称为Utility的库。你可以在这找到checked_delete, 一个函数,用于确认在删除点的类型是完整的;还有类noncopyable,用于确保类不能被复制

cbNotes的专栏:不积硅步,无以至千里;不积小流,无以成江海! 1776

boost::static_assert

原文地址:http://www.smth.edu.cn/bbsanc.php?path=%2Fgroups%2Fdevelop.faq%2FProgramming%2Flanguages%2Fc_cpp%2Fboost%2FM.1021441404.O0 发信人:flier(小海(:好日子不多了:)),信区:Programming 标题:boost::static_assert 发信站:BBS水木...

luliangok 165

Beyond the C++ Standard Library: An Introduction to Boost -- Library 3.2 BOOST_STATIC_ASSERT

BOOST_STATIC_ASSERT头文件: "boost/static_assert.hpp"在运行期执行断言可能是你经常用到的,也是非常合理的。它是测试前置条件、后置条件以及不变式的好方法。执行运行期断言有很多不同的方法,但是在编译期你如何进行断言呢?当然,唯一的方法就是让编译器产生一个错误,这是很平常的事情(我在无意中都做过几千次了),但如何从错误信息中获得有意义的信息却不是那

1427

Boost - BOOST_STATIC_ASSERT-运行期执行断言

[color=green][i][b] Author:QQ174554431 [/b][/i][/color] 头文件 [code="c++"]#include "boost/static_assert.hpp[/code] 用法: [code="c++"]BOOST_STATIC_ASSERT(sizeof(int)==4);[/code]

beattwo的专栏 153

boost-断言

标准assert宏的原型声明在<assert.h>中,其作用是如果它的测试条件为假,则调用abort()终止程序执行,程序退出的时候会弹出一个错误提示框,并向控制台输出所在文件及行号。assert()只针对debug版本,在Release版本中assert()是无效的。 使用建议:每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败。 ...

weixin_30765577的博客 213
上一篇: RNN中LSTM网络用法
下一篇: C++ 常用技巧--new头文件
Poo_Chai
博客等级 码龄9年 178粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Poo_Chai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值