全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++ Assert()断言机制原理以及使用方法

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小时内与您取得联系。