MSDN原文如是说:

Evaluates an expression and, when the result is false, prints a diagnostic message and aborts the program.
(判断一个表达式,如果结果为假,输出诊断消息并中止程序。)
void assert( int expression );
参数:Expression (including pointers) that evaluates to nonzero or 0.(表达式【包括指针】是非零或零)
原理:assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。
MSDN示例程序
// crt_assert.c
// compile with: /c
#include <stdio.h>
#include <assert.h>
#include <string.h>
void analyze_string( char *string ); // Prototype
int main( void )
{
char test1[] = "abc", *test2 = NULL, test3[] = "";
printf ( "Analyzing string '%s'\n", test1 ); fflush( stdout );
analyze_string( test1 );
printf ( "Analyzing string '%s'\n", test2 ); fflush( stdout );
analyze_string( test2 );
printf ( "Analyzing string '%s'\n", test3 ); fflush( stdout );
analyze_string( test3 );
}
// Tests a string to see if it is NULL,
// empty, or longer than 0 characters.
void analyze_string( char * string )
{
assert( string != NULL ); // Cannot be NULL
assert( *string != '\0' ); // Cannot be empty
assert( strlen( string ) > 2 ); // Length must exceed 2
}
输出结果
Analyzing string 'abc' Analyzing string '(null)' Assertion failed: string != NULL, file assert.cpp, line 25 abnormal program termination
用法总结:
1) 在函数开始处检验传入参数的合法性
如:
int resetBufferSize(int nNewSize)
{
//功能:改变缓冲区大小,
//参数:nNewSize 缓冲区新长度
//返回值:缓冲区当前长度
//说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区
assert(nNewSize >= 0);
assert(nNewSize <= MAX_BUFFER_SIZE);
...
}
2) 每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败
不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
好: assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);
3) 不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题
错误: assert(i++ < 100)
这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。
正确: assert(i < 100);
i++;
4) assert和后面的语句应空一行,以形成逻辑和视觉上的一致感
5) 有的地方,assert不能代替条件过滤
ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略掉。(在C中,ASSERT是宏而不是函数),使用ASSERT“断言”容易在debug时输出程序错误所在。
而assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。
使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。
在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include <stdio.h>
#define NDEBUG
#include <assert.h>
加入#define NDEBUG之后,上文第一个例子输出结果为:
Analyzing string 'abc' Analyzing string '(null)' Analyzing string ''
在面试中经常用到的一个题目:
已知memcpy的函数为: void* memcpy(void *dest , const void* src , size_t count)其中dest是目的指针,src是源指针。不调用c++/c的memcpy库函数,请编写memcpy。
void* memcpy(void *dst, const void *src, size_t count)
{
//安全检查
assert( (dst != NULL) && (src != NULL) );
unsigned char *pdst = (unsigned char *)dst;
const unsigned char *psrc = (const unsigned char *)src;
//防止内存重复
assert(!(psrc<=pdst && pdst<psrc+count));
assert(!(pdst<=psrc && psrc<pdst+count));
while(count--)
{
*pdst = *psrc;
pdst++;
psrc++;
}
return dst;
}
以上这篇C++ Assert()断言机制原理以及使用方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# c
# assert
# 断言
# C++ 中assert()函数用法总结
# 详解C++编程中断言static_assert的使用
# C++ assert()函数用法案例详解
# C/C++ assert()函数用法案例总结
# C++之assert推荐用法及注意事项
# 这条
# 给大家
# 第一个
# 多个
# 它是
# 可以通过
# 希望能
# 只在
# 一个重要
# 如是说
# 这么做
# 这篇
# 用在
# 这是因为
# 如在
# 即为
# 小编
# 它与
# 值为
# 大家多多
相关文章:
Swift中swift中的switch 语句
建站之星微信建站一键生成小程序+多端营销系统
Python多线程使用规范_线程安全解析【教程】
实例解析angularjs的filter过滤器
如何在IIS7上新建站点并设置安全权限?
建站之星安装提示数据库无法连接如何解决?
如何通过cPanel快速搭建网站?
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
韩国服务器如何优化跨境访问实现高效连接?
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
如何确保西部建站助手FTP传输的安全性?
在线制作视频的网站有哪些,电脑如何制作视频短片?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
电商网站制作公司有哪些,1688网是什么意思?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
建站之星伪静态规则如何正确配置?
建站168自助建站系统:快速模板定制与SEO优化指南
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
建站之星如何助力网站排名飙升?揭秘高效技巧
北京制作网站的公司,北京铁路集团官方网站?
如何用花生壳三步快速搭建专属网站?
C++如何使用std::optional?(处理可选值)
如何实现建站之星域名转发设置?
建站之星代理平台如何选择最佳方案?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
定制建站如何定义?其核心优势是什么?
建站之星展会模版如何一键下载生成?
内部网站制作流程,如何建立公司内部网站?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
建站ABC备案流程中有哪些关键注意事项?
建站之星会员如何解锁更多建站功能?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
,如何利用word制作宣传手册?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
如何在宝塔面板中创建新站点?
官网网站制作腾讯审核要多久,联想路由器newifi官网
网站制作知乎推荐,想做自己的网站用什么工具比较好?
建站org新手必看:2024最新搭建流程与模板选择技巧
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
开源网站制作软件,开源网站什么意思?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
如何做静态网页,sublimetext3.0制作静态网页?
*请认真填写需求信息,我们会在24小时内与您取得联系。