C++技巧之断言Assert(2)

C/C++assert 断言 一、动态断言assert assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include void assert( int expression ); assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息, 然后通过调用 abort 来终止程序运行。 #include 阅读详情

断言的应该是一种编程的常见技巧。我所应用的断言有两种,一种是动态断言,即大家所熟知的C标准库的assert()宏,一种是C++中的静态断言,即在编译期间检查。

 

1)动态断言:assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:

#include <assert.h>  
void assert( int expression );  

 

assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。
大家要注意是,其中的表达式为假时,会终止程序运行,包括我在内经常会写错代码,断言一个指针是否为空,往往写成了
assert(!p);其实应该写成assert(p);
assert是运行期的判断,并且会强制终止程序,一般要求只能用于debug版本中,是为了尽可能快的发现问题。尤其在我所从事的电信软件产品中,assert是要从release版本中去掉。所以一般开发会重新定义assert宏。


2)静态断言,在新的C++标准中C++0x中,加了对静态断言的支持,引入了新的关键字static_assert来表示静态断言。使用静态断言,我们可以在程序的编译时期检测一些条件是否成立。但这个关键字太新了,没有几个编译器是支持的(好像VC2008支持,我用VC很少,主要是在linux下C++编程)。于是可以使用C++现有的模板特性来实现静态断言的功能。boost中也已有BOOST_STATIC_ASSERT宏的实现,有兴趣的同学可以down下来仔细研究一下,它的断言信息更丰富,下面为我的简单实现:

 

// declare a tempalte class StaticAssert.  
template <bool assertion> struct StaticAssert;  
  
// only partial specializate parameter's value is true.  
template <> struct StaticAssert<true>   
{  
  enum { VALUE = 1 };  
};  

#define STATIC_ASSERT(expression) (void)StaticAssert<expression>::VALUE 

  

 

原理是,先声明一个模板类,但后面仅仅偏特化参数值为true的类,而为false的类则一个未定义的类,即是一个未完整的类型,编译期间无法找到StaticAssert<false>::VALUE类型。举例如下:

STATIC_ASSERT(4 == sizeof(long) ); //在 32bit机上OK  
STATIC_ASSERT(4 == sizeof(long) ); //在 64bit机上NG,long为8字节  

静态断言在编译时进行处理,不会产生任何运行时刻空间和时间上的开销,这就使得它比assert宏具有更好的效率。另外比较重要的一个特性是如果断言失败,它会产生有意义且充分的诊断信息,帮助程序员快速解决问题。

 

文章来源: https://www.cnblogs.com/bdbw2012/archive/2013/05/21/3091198.html

c++11之静态断言(static_assert) 一、 断言概念      所谓“断言”,它是一种表现行为,亦是一种编程手段。它总是将需要“返回值为真的判别式”放到语句中,其所扮演的角色就是告知系统当程序的某个条件其值不为真的时候,退出程序,不再继续执行下去。需要知晓的是,断言并不是代码中必不可缺的部分,因为它是可替代的,比如用if(条件判断)、#error(预处理宏)来完成断言同样的效果。存在即合理,断言必然有它存在理由。它可以快速定位到程序出... 阅读详情

相关推荐

assert2-rs:由Catch2启发的Rust的assert!()和check!()宏

断言2 万能的和宏,受启发。 默认情况下,还有一个宏在优化的版本中被禁用。 作为顶部的樱桃,有一个宏,可让您在捕获模式的一部分的同时对其进行测试。 为什么使用这些宏? 这些宏相对于标准库中的断言提供了一些好处: 宏会解析您的表达式以检测比较并相应地调整错误消息。 不再需要assert_eq或assert_ne ,只需编写assert!(1 + 1 == 2) ,甚至assert_ne assert!(1 + 1 == 2) assert!(1 + 1 > 1) ! 您可以测试模式匹配: assert!(let Err(_) = File::open("/non/existing/file")) 。 您可以使用let_assert!(...)宏捕获模式的某些部分以进行进一步测试。 check宏可用于在恐慌之前执行多次检查。 断言失败时,宏将提供更多信息。 彩色故障消息! 宏

朱老师C++第4部分- 4.2.使用gtest做单元测试

《朱老师带你学C++》属于系列课程《朱有鹏老师热门编程语言全解》的第4部分,主要针对C++语言学习。本课程可以看做是嵌入式linux核心课程中《C语言专题》课程的延续,在学好了C语言前提下继续深度学习C++语言。整个课程共分为5部分。涵盖了C++基础语法和使用,面向对象,STL与泛型,Boost库和设计模式,C++编程优化技巧等非常广泛的内容,是市面上非常缺少的深度完整学习C++,培养编程技能和修养的一套系列学习课程。朱老师C++第1部分-从C到C++朱老师C++第2部分-C++和面向对象朱老师C++第3部分-STL等和泛型朱老师C++第4部分-C++编程优化和常见面试题朱老师C++第5部分-Boost库和设计模式 课程特色*深入浅出,通俗易懂。不怕学不会,就怕你不学习。*思路清晰、语言风趣,对着视频看也不会想睡觉······*视频 + 文档 + 练习题 + 答疑相结合。*基础知识 + 思路引导的教学方式,授之以鱼更授之以渔。*系列课程。本教程只是入门篇,后续还有更多更精彩视频更新中。

分享一些基于微信小程序开发的小游戏源码

小游戏小程序是运行在微信生态系统(或其他支持小程序的平台)中的轻量级应用程序,专为休闲游戏体验而设计的小程序子类别,小游戏小程序通常体积较小,加载速度快,用户无需等待长时间即可开始游戏。用户无需下载或安装单独的游戏应用程序,即可通过小程序入口直接进入游戏,同时小游戏小程序通常包含排行榜、分享功能等社交元素,可以增强游戏体验并促进用户参与。game.js:游戏页面的逻辑文件,包含页面数据、生命周期函数、事件处理函数等。game.wxml:游戏页面的结构文件,定义了页面的布局和组件。

xinshangdian的博客 6226

C++技巧之断言Assert

断言的应该是一种编程的常见技巧。我所应用的断言有两种,一种是动态断言,即大家所熟知的C标准库的assert()宏,一种是C++中的静态断言,即在编译期间检查。 1)动态断言:assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include void assert( int expression ); assert的作用是先计算表达式 expre

7878

Debian下Rust环境极速安装指南:国内镜像+避坑配置(附清华/中科大源对比)

本文详细介绍了在Debian系统上快速安装和配置Rust开发环境的完整指南。针对国内网络环境,重点对比评测了清华大学、中国科学技术大学等主流镜像源,提供了详细的安装配置步骤、Cargo优化技巧以及常见问题排查方案,帮助开发者显著提升依赖下载和编译效率。

s8t9u0v1w的博客 1161

【逆向实战入门】Lua Hook进阶:从函数拦截到流程控制的实战解析

本文深入解析Lua Hook技术的进阶应用,从基础函数拦截到复杂流程控制,提供实战技巧与避坑指南。通过保存原函数指针、条件性Hook及调用栈分析等高级方法,帮助开发者在游戏辅助、自动化工具等场景中精准控制程序行为,同时确保稳定性和反检测能力。

weixin_30613343的博客 331

Android 6.0 Libc库中的弱引用使用

关于强弱符号,强弱引用可查看关于C语言中的强符号、弱符号、强引用和弱引用 ,这里记录一下目前更新到Android 6.0 在libc库中遇到的弱引用失效问题。 Libc库编译 可查看android 源码下的\bionic\libc\Android.mk # Don't re-export new/delete and friends, even if the compiler rea

jscese 2501

浙政钉H5应用上架实战:从环境配置到发布避坑指南

本文详细解析浙政钉H5应用上架全流程,从环境配置到发布避坑指南。重点介绍Vue 2.6 + Node 14.21.3的稳定开发环境搭建、项目结构规范及常见报错解决方案,帮助开发者高效完成浙政钉H5应用上架流程。

weixin_27943395的博客 286

【sv】assert-2

assert相关,过程记录,持续更新。

stm32stu的博客 380

Synopys 验证系列-EDA 总结

VC Formal 解决方案包括一整套正式应用程序 (App),包括属性验证 (FPV)、自动提取属性 (AEP)、覆盖分析器 (FCA)、连接性检查 (CC)、时序等效性检查 (SEQ)、寄存器验证 (FRV)、测试平台分析仪 (FTA)、形式导航器 (NAV) 以及用于验证标准总线协议的一组断言 IP (AIP)。

qq_41289491的博客 1427

RAG面试内容整理-7. 多轮问答与上下文拼接策略

在对话式的RAG应用中,多轮问答需要处理上下文相关性问题:用户的提问往往依赖于之前的对话内容。为正确理解用户每一轮的问题,系统需要保留和传递对话历史信息。

不务正业的猿 376

c++中assert(断言)的用法

c++ 的assert 用法

zxl_1996的博客 2403

基于Python的房地产评估数据抓取与分析 —— 房价走势与市场报告

在房地产行业中,了解和分析房产价格的变化趋势、各个地区的房价差异以及市场评价报告,可以帮助投资者、购房者以及政策制定者做出更加明智的决策。本文介绍了如何使用Python爬虫技术抓取房地产平台上的房产评估报告、价格走势等数据,并对抓取的数据进行分析。通过这些技术,您可以自动化抓取房地产平台的数据,分析房价走势,获取市场报告,为房地产投资决策提供数据支持。假设我们要从链家网抓取某个房产的价格、房产描述以及历史成交价格,首先需要获取目标房产页面的URL,并发送HTTP请求。伪装为常见浏览器,避免被识别为爬虫。

2201_76125261的博客 846

【C/C++】详解 assert() 断言(什么是assert? assert有什么作用?)

在编写程序过程中,尤其是调试代码时,往往需要一个提醒代码漏洞/Bug的小助手,以便于程序员及时修改和完善代码。那么assert关键字就可以成为这个小助手。

weixin_45031801的博客 9万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C++断言 static_assert, complie_assert, preComplie_assert

1. 断言(assertion)分类:运行时、预编译期、编译期,即断言的判断触发时机\2. 运行时断言使用assert宏来实现\3. 一旦定义了NDEBUG宏,那么assert宏将被展开成一条空语句不起作用,(可能会)被编译器优化掉,原意是在非Debug编译下不把运行时assert编进来\4. 预编译时期的断言可以使用预处理命令#ifdef或#ifundef配合#error实现,可以在预编译时期对一些宏进行检查以确定编译参数、头文件引用状态等。

C++ 是一门不原谅粗心的语言,而我恰好喜欢这种不原谅。 我是 x,正在成为更严谨的 C++ 开发工程师的路上。 4903

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

断言(ASSERT)

传统,用于验证 Qt 程序的假设。的命名直接继承了 C 的。

Actiman 1860

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【C++】C++ assert(断言)

assert 是一个用于调试的宏,定义在 <cassert> 头文件中。它在运行时检查一个条件表达式,若条件为假( false),则终止程序并输出错误信息(包含文件名、行号、条件表达式)。

weixin_43510208的博客 1626

【C++断言机制】深入理解C/C++ 中静态断言static_assert与断言 assert

断言(assertion)是一种在代码中声明某些事情为真的方式。当这些声明被违反时,它们会产生错误。这听起来很简单,但为什么它如此重要?

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1332

【C/CPP】assert断言与static_assert静态断言

一、断言 assert是一个宏函数,其原型定义在assert.h中: #ifdef NDEBUG #define assert(condition) ((void)0) #else #define assert(condition) #endif 一般在调试版本中使用,作用是在程序运行的时候将条件condition的表达式的逻辑值与0进行比较,若相等,则在标准错误输出上输出实现指定的诊断信息,...

baymaxly的博客 1937

assert断言

1.assert断言介绍1.assert断言介绍1.使用方法assert.h 头头件定义了宏,用于在运行时确保程序符合指定条件,如果不符合,就。这个宏常常被称为。例如在以上代码中就可以用assert断言来替代if语句assert() 宏接受⼀个表达式作为参数。如果该表达式为真(返回值非零,程序继续运行。如果该表达式为假(返回值为零),,在标准错误流(屏幕上) stderr 中写入⼀条,显示没有通过的表达式,以及包含这个表达式的真如以上所示,当assert后表达式为假时候就会。

mljy.博客 1366

C++11静态断言static_assert

本文介绍了C++11引入的静态断言static_assert

hubing_hust的专栏 6471

C++断言

断言简述 断言(assertion)是编程中的一种常用手段,在通常情况下,断言就是将一个返回值总是真(或者我们需要是真)的判别式放在语句中,用以排除在设计逻辑上不应该出现的情况。举个例子:我们都知道除数不能为0,那么就可以对除数使用断言,以使程序在除数为0的情况下产生异常退出。 通常来说,断言并不是正常程序所必需的,但对于程序调试来说,通常断言能够帮助开发者快速定位那些违反了某些前提条件的程序...

程序人生 1万+

C/C++ Assert断言 详解

assert(断言)本质是宏,由C/C++标准库提供的一个调试工具。它以一种简洁的形式在代码中嵌入“安全检查”机制。在程序运行时,assert会对一个指定的条件表达式进行求值,并根据结果决定程序是否继续执行。如果条件不成立,则立即终止程序并报错,帮助开发者快速定位由于事先没有考虑周到或外部异常输入等原因造成的各种bug。

qq_42561732的博客 1386

C++---断言assert

C++中断言(assert)是调试阶段的程序验证工具,通过宏实现条件检查,在调试模式中若条件为假则终止程序并输出错误信息。其优点是快速定位逻辑错误,可在发布版本通过NDEBUG宏完全禁用。断言适用于函数参数验证等"不应发生"的错误检测,但不替代运行时异常处理。与之相比,异常处理更适用于生产环境中可恢复的错误,通过try/catch机制实现程序继续执行。开发者需根据场景选择:断言检测程序内部逻辑错误,异常处理外部可预见的运行时问题。

MzKyle的博客 1729
上一篇: C++断言与静态断言(1)
下一篇: 6 种用 LSTM 做时间序列预测的模型结构 - Keras 实现
Poo_Chai
博客等级 码龄9年 178粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值