用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 是一个广泛使用的 C++ 库,由 C++ 标准库的开发者参与编写,旨在增强 C++ 的功能和实用性。Boost 提供了一系列跨平台的工具和库,适用于 Linux 和 Windows 系统。学习 Boost 对于提升 C++ 开发者的技能和效率...
C#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_AssertC#例子代码 A0002_...
2. 使用概念:在模板类或函数中,通过`BOOST_CONCEPT_ASSERT`或`BOOST_CONCEPT_REQUIRES`宏来检查模板参数。例如: ```cpp template void function(Iterator it) { BOOST_CONCEPT_ASSERT((boost::...
在实际操作中,开发者可以将PPK_ASSERT的源码添加到项目中,通过包含头文件并在适当的地方使用其提供的断言宏,如`PPK_ASSERT(expr)`,来替代标准的`assert(expr)`,从而实现更强大的断言功能。 总结来说,PPK_...
debug_assert, 简单灵活和模块化断言宏 debug_assert debug_assert是只提供一个非常灵活的DEBUG_ASSERT() 宏的简单。C 11.头库。 你自己写了多少次断言宏,因为 assert() 是全局控制的,不能在程序的某些部分启用? ...
包含的`006_Q_ASSERT_Demo`可能是一个演示如何使用`Q_ASSERT`和`Q_ASSERT_X`的示例项目。这个项目可能包含了一些示例代码,展示在不同场景下如何合理地插入断言,并给出了断言触发时的输出结果。 通过理解并熟练...
官方离线安装包,亲测可用
debug_assert debug_assert是一个简单的C ++ 11,仅标头的库,它提供了非常灵活的DEBUG_ASSERT()宏。 您自己写了一个断言宏多少次,因为assert()是全局控制的,并且不能仅对程序的某些部分启用? 该库通过提供灵活...
C++编程中断言static_assert的使用是C++开发中的一个重要知识点,尤其对于初学者来说,在编写调试程序时,掌握断言的使用可以更有效地发现程序中的错误,同时static_assert作为C++11新增的特性,它允许在编译时期...
资源分类:Python库 所属语言:Python 资源全名:pytest_cache_assert-1.1.1.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
在编程中,`test_assert`通常指的是测试断言,这是一种用于验证程序中特定条件是否满足的工具。在C语言中,`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] ...
1. **宏定义的选择**:在 `stm32f10x_conf.h` 文件中,可以通过设置宏 `USE_FULL_ASSERT` 来启用或禁用 `assert_param` 功能。当定义了 `USE_FULL_ASSERT` 时,`assert_param` 才会被激活,否则该宏将不起作用。 `...
【快速断言体系】一步步搭建一个高效的快速断言体系
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使用详解 assert_param是一个宏定义,在STM32的固件库和示例程序中广泛使用。它的主要作用是检测传递给函数的参数是否是有效的参数。如果参数无效,assert_param将报告错误,使程序员可以及时...
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关键字的作用、用法及其在编译期检查中的重要性。通过详细的代码示例,阐述了如何利用static_assert对代码中的各种条件进行静态验证,包括类型特征、常量表达式、模板参数约束...
### C++与操作系统面试题解析:静态断言(Static Assertion) #### 题目背景 ...对于那些从事模板编程或者需要对类型有严格要求的应用来说,了解并熟练掌握`static_assert`的使用方法是非常重要的。