1 #include<stdio.h>2 #include<assert.h>3 4 char * Strcpy(char *dst,const char *src)  5 {6     assert(dst != NULL && src != NULL);  7     char *ret = dst; 8     while ((*dst++=*src++)!='\0'); 9     return ret;
10 }

今天在实现strcpy函数时用到了assert函数,其中assert是一个断言,就是看后面是否成立,如果成立则继续运行,否则就不执行了,即断言失败

又去搜了一下,发现了一篇更为详细的assert()函数用法总结,博主为Glory,存放于此,与大家共勉;

链接为http://www.cnblogs.com/ggzss/archive/2011/08/18/2145017.html#3269450

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

#include <assert.h>

void assert( int expression );

  assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。请看下面的程序清单badptr.c:

复制代码

#include <stdio.h>#include <assert.h>#include <stdlib.h>int main( void ){FILE *fp;fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件
assert( fp );                           //所以这里不会出错
fclose( fp );fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败
assert( fp );                           //所以这里出错
fclose( fp );                           //程序永远都执行不到这里来return 0;}

运行结果:

  已放弃使用assert()的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:

#include <stdio.h>

#define NDEBUG

#include <assert.h>

用法总结与注意事项:

  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是用来避免显而易见的错误的,而不是处理异常的。错误和异常是不一样的,错误是不应该出现的,异常是不可避免的。c语言异常可以通过条件判断来处理,其它语言有各自的异常处理机制。

一个非常简单的使用assert的规律就是,在方法或者函数的最开始使用,如果在方法的中间使用则需要慎重考虑是否是应该的。方法的最开始还没开始一个功能过程,在一个功能过程执行中出现的问题几乎都是异常。

转载于:https://www.cnblogs.com/Miranda-lym/p/5192344.html

浅谈assert()函数的用法相关推荐

  1. 浅谈async函数await用法

    async和await相信大家应该不陌生,让异步处理变得更友好. 其实这玩意儿就是个Generator的语法糖,想深入学习得去看看Generator,不然你可能只停留在会用的阶段. 用法很简单,看代码 ...

  2. 浅谈云函数的代理IP利用面

    浅谈云函数的代理IP利用面 前言 本篇文章介绍如何通过 Serverless(云函数) 实现各种扫描器探测功能,以达到绕过态势感知.WAF等安全设备,增大蓝队研判人员溯源难度,实现封无可封,查无可查的 ...

  3. 浅谈Python3函数命名空间与作用域

    日期:2020年1月23日 作者:Commas 注释:前一章节讲述了命名空间和作用域的知识,现在我们来谈一谈Python3函数的命名空间吧. 如果您想了解更多有关Python的知识,那么请点<我 ...

  4. Python之浅谈exec函数

      在Python中,exec()是一个十分有趣且使用的内置函数,不同于eval()函数只能执行计算数学表达式的结果的功能,exec()能够动态地执行复杂的Python代码,能够十分强大.具体的介绍可 ...

  5. C++中assert函数的用法介绍

    assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #inclide<assert.h> void assert(int ...

  6. 浅谈javascript函数劫持

    创建时间:2007-12-02 文章属性:原创 文章提交:hkluoluo (luoluonet_at_hotmail.com) by luoluo on 2007-11-30 luoluonet_a ...

  7. C语言中assert()函数的用法总结

    一.原型定义 assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行, 原型定义: #include <assert.h> void a ...

  8. C语言中assert函数的用法

    断言(ASSERT)的用法 我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错". 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,asse ...

  9. 浅谈时间函数gettimeofday的成本

    我们在程序中会频繁地取当前时间,例如处理一个http请求时,两次调用gettimeofday取差值计算出处理该请求消耗了多少秒.这样的调用无处不在,所以我们有必要详细了解下,gettimeofday这 ...

  10. Glibc:浅谈 malloc() 函数具体实现

    简介 源代码 __libc_malloc() _int_malloc() __libc_malloc() 分析 参数 __malloc_hook 全局钩子 ptmalloc_init 转入 _int_ ...

最新文章

  1. 电子科技大学计算机网络实验,计算机网络实验电子科技大学.doc
  2. 【网络安全】如何利用工具发现内部或外部网络攻击面
  3. python自定义函数画图_4.1-5 自定义函数
  4. 如何有效控制 Go 线程数?
  5. sharepoint_study_7
  6. windows搭建SVN服务器
  7. 计算机网络断开后怎么连接,电脑网络断开怎样重新连接
  8. 【大电流H桥电机驱动电路的设计与解析(包括自举电路的讲解,以IR2104+LR7843为例)】
  9. matpolitlib 画图
  10. 圆柱壳matlab,[matlab遗传算法工具箱论文]基于遗传算法和BP神经网络的圆柱壳大...
  11. linux 命令杂集
  12. 又拍网架构中的数据库分库设计
  13. eui显示玩家服务器,EUI - 魔兽世界最贴心的插件
  14. 3.单片机 数码管显示
  15. 天翼云打造国云安全品牌 铸牢企业云上安全防线
  16. 吉尼斯官方确认火狐首日下载世界记录
  17. Harry Potter and the Order of the Phoenix
  18. 服务器gpu卡型号V100,NVIDIA GPU服务器升级:16块450W Tesla V100
  19. 王学岗Kotlin协程(三)---协程的上下文与协程的异常处理
  20. 欧姆龙NX1P2编程学习(1)-编写功能块注意事项

热门文章

  1. 最简单的Windows窗体应用程序,它存在什么问题?
  2. 简单介绍如何用Reporting Service制作报表
  3. 哈希(不可逆)加密通用类库函数
  4. EMNLP2021 论文预讲会,邀你一起共赏自然语言处理学术盛宴(日程全公开)
  5. 【每日一读】EMNLP2020: 面向多跳问答的分层图网络
  6. 我以为内卷是外包的反义词!
  7. 干货 | Github标星近3w,热榜第一,如何用Python实现所有算法和一些神经网络模型...
  8. 数据科学包11-数据可视化
  9. 从零实现深度学习框架——Softmax回归简介
  10. 李宏毅机器学习——无监督学习(五)