`
yesjavame
  • 浏览: 697033 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

用BOOST_ASSERT代替assert

阅读更多

用BOOST_ASSERT代替assert

(转载请注明来源于金庆的专栏)

断言assert()简单地输出错误信息并调用abort()退出是相当好用的功能.
错误信息包括文件名, 代码行, 及出错的表达式.
(如果能像Java, Python那样获取出错时的调用栈(traceback)就更好了,
可惜C++中好像无法得到调用栈?)

出于某些特殊的目的, 可以用BOOST_ASSERT()来代替assert().
BOOST_ASSERT()比assert()更灵活, (虽然也没有调用栈信息),
其基本的行为与assert()一致.

有两点扩展功能:

1. 可以定义BOOST_DISABLE_ASSERTS来停用BOOST_ASSERT().

assert通过定义NDEBUG来停用, 但是有时候想要发布一个调试版,
不能定义NDEBUG, 无法停用assert().
用BOOST_ASSERT()就多了一个控制选项, 即可以在调试版中停用断言.

2. 可以定义BOOST_ENABLE_ASSERT_HANDLER, 来调用自定义的断言出错函数.

如果定义了 BOOST_ENABLE_ASSERT_HANDLER,
BOOST_ASSERT 失败则调用 ::boost::assertion_failed().
如果未定义BOOST_ENABLE_ASSERT_HANDLER,则会调用标准的assert().

boost/assert.hpp中只声明了assertion_failed(), 需要自己定义.
它有4个参数, 分别是出错表达式串, 函数名, 文件名, 行号.

有了自定义的断言出错处理函数, 就可以实现断言出错时记录日志并续继执行.
(个人觉得这不是个好主意, 但被要求如此实现, 只好努力去满足).
绝妙的是, 可以通过宏来控制自己想要的断言行为.

分享到:
评论

相关推荐

    Boost学习笔记

    Boost 是一个广泛使用的 C++ 库,由 C++ 标准库的开发者参与编写,旨在增强 C++ 的功能和实用性。Boost 提供了一系列跨平台的工具和库,适用于 Linux 和 Windows 系统。学习 Boost 对于提升 C++ 开发者的技能和效率...

    C#例子代码 A0002_Assert

    C#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_...

    boost_concept_check.rar_Boost

    2. 使用概念:在模板类或函数中,通过`BOOST_CONCEPT_ASSERT`或`BOOST_CONCEPT_REQUIRES`宏来检查模板参数。例如: ```cpp template void function(Iterator it) { BOOST_CONCEPT_ASSERT((boost::...

    PPK_ASSERT:PPK_ASSERT是一个跨平台的,自包含的C ++断言库

    在实际操作中,开发者可以将PPK_ASSERT的源码添加到项目中,通过包含头文件并在适当的地方使用其提供的断言宏,如`PPK_ASSERT(expr)`,来替代标准的`assert(expr)`,从而实现更强大的断言功能。 总结来说,PPK_...

    debug_assert, 简单灵活和模块化断言宏.zip

    debug_assert, 简单灵活和模块化断言宏 debug_assert debug_assert是只提供一个非常灵活的DEBUG_ASSERT() 宏的简单。C 11.头库。 你自己写了多少次断言宏,因为 assert() 是全局控制的,不能在程序的某些部分启用? ...

    QtApplets-Q-ASSERT使用

    包含的`006_Q_ASSERT_Demo`可能是一个演示如何使用`Q_ASSERT`和`Q_ASSERT_X`的示例项目。这个项目可能包含了一些示例代码,展示在不同场景下如何合理地插入断言,并给出了断言触发时的输出结果。 通过理解并熟练...

    rubygem-power_assert-0.3.1-1.el7.noarch(1).rpm

    官方离线安装包,亲测可用

    debug_assert:简单,灵活和模块化的声明宏

    debug_assert debug_assert是一个简单的C ++ 11,仅标头的库,它提供了非常灵活的DEBUG_ASSERT()宏。 您自己写了一个断言宏多少次,因为assert()是全局控制的,并且不能仅对程序的某些部分启用? 该库通过提供灵活...

    详解C++编程中断言static_assert的使用

    C++编程中断言static_assert的使用是C++开发中的一个重要知识点,尤其对于初学者来说,在编写调试程序时,掌握断言的使用可以更有效地发现程序中的错误,同时static_assert作为C++11新增的特性,它允许在编译时期...

    Python库 | pytest_cache_assert-1.1.1.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:pytest_cache_assert-1.1.1.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    test-assert.rar_games_test assert

    在编程中,`test_assert`通常指的是测试断言,这是一种用于验证程序中特定条件是否满足的工具。在C语言中,`assert()`函数是用于进行断言检查的标准库函数,它在调试阶段非常有用,可以帮助开发者检测代码逻辑错误。...

    power_assert_ex:Elixir中的Power Assert。 显示每个表达式的评估结果

    在Elixir中,我们可以用以下方式引入`power_assert_ex`库: ```elixir defmodule MyTest do use ExUnit.Case import PowerAssert test "example" do assert [1, 2, 3] |> Enum.map(&(&1 + 1)) == [2, 3, 4] ...

    assert_param-转载.txt

    1. **宏定义的选择**:在 `stm32f10x_conf.h` 文件中,可以通过设置宏 `USE_FULL_ASSERT` 来启用或禁用 `assert_param` 功能。当定义了 `USE_FULL_ASSERT` 时,`assert_param` 才会被激活,否则该宏将不起作用。 `...

    auto_assert.py

    【快速断言体系】一步步搭建一个高效的快速断言体系

    safe-assert:适用于Python的安全且可组合的断言,可以与优化模式一起使用

    from safe_assert import safe_assert def sort_positive_numbers ( numbers : List [ int ]) -> List [ int ]: safe_assert ( all ( num >= 0 for num in numbers ), 'found negative' ) return sorted ( ...

    STM32中assert_param的使用

    STM32 assert_param使用详解 assert_param是一个宏定义,在STM32的固件库和示例程序中广泛使用。它的主要作用是检测传递给函数的参数是否是有效的参数。如果参数无效,assert_param将报告错误,使程序员可以及时...

    pry-power_assert

    gem 'pry-power_assert' 然后执行: $ bundle 或者自己安装: $ gem install pry-power_assert 用法 开始撬。 $ pry 输入pa RUBY_CODE [ 1 ] pry ( main ) > pa "0" . class == "3" . to_i . times . map ...

    C++ 中 static-assert:编译期的强力断言机制解析

    本文深入探讨了 C++ 中的static_assert关键字的作用、用法及其在编译期检查中的重要性。通过详细的代码示例,阐述了如何利用static_assert对代码中的各种条件进行静态验证,包括类型特征、常量表达式、模板参数约束...

    C++与操作系统等面试题82

    ### C++与操作系统面试题解析:静态断言(Static Assertion) #### 题目背景 ...对于那些从事模板编程或者需要对类型有严格要求的应用来说,了解并熟练掌握`static_assert`的使用方法是非常重要的。

Global site tag (gtag.js) - Google Analytics