assert宏的原型定义在<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;
}

[root@localhost error_process]# gcc badptr.c 
[root@localhost error_process]# ./a.out 
a.out: badptr.c:14: main: Assertion `fp' failed.
已放弃

使用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不能代替条件过滤

ref:http://blog.csdn.net/setone/article/details/5573036

C语言断言assert详解相关推荐

  1. 断言(assert)详解

    目录 一.assert定义 二.用法总结与注意事项 四.以下是使用断言的几个原则: 一.assert定义 我一直以为 assert 仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错 ...

  2. java 断言 assert 详解:断言开启、断言使用

    java中的断言Assert的使用 一.背景 二.如何判断是否开启了断言 三.开启断言 四.断言的使用 方法一.assert <boolean表达式> 方法二.assert <boo ...

  3. php7 断言,PHP 断言(assert) 详解

    PHP 中的断言常用于调试,检查一个表达式或语句是否为 FALSE.本文带你重新认识 PHP assert() 函数的神(Qi)通(Yin)广(Ji)大(Qiao). 本文基于 PHP Version ...

  4. php 断言,PHP 断言(assert) 详解

    PHP 中的断言常用于调试,检查一个表达式或语句是否为 FALSE.本文带你重新认识 PHP assert() 函数的神(Qi)通(Yin)广(Ji)大(Qiao). 本文基于 PHP Version ...

  5. (转)C语言位运算详解

    地址:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html C语言位运算详解 作者:911 说明:本文参考了http://www2.ts ...

  6. R语言基础知识详解及概括

    R语言基础知识详解及概括 目录 R语言基础知识详解及概括 R数据可视化示例 R语言进行数据创建

  7. c语言练习题及答案)(1),c语言练习题(带详解答案)1.pdf

    c语言练习题(带详解答案)1 (-2) -1: 一单项选择题 /为求商运算符,该运算符能够对整型.字符.浮点等类型的数 据进行运算,5/2 2 1.(A )是构成C语言程序的基本单位. 11.如果 i ...

  8. python语言的格式框架_django框架模板语言使用方法详解

    本文实例讲述了django框架模板语言使用方法.分享给大家供大家参考,具体如下: 模板功能 作用:生成html界面内容,模版致力于界面如何显示,而不是程序逻辑.模板不仅仅是一个html文件,还包括了页 ...

  9. C语言再学习 -- 详解C++/C 面试题 2

    (经典)C语言测试:想成为嵌入式程序员应知道的0x10个基本问题. 参看:嵌入式程序员面试问题集锦 1.用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define ...

  10. python自动解析json_Python语言解析JSON详解

    本文主要向大家介绍了Python语言解析JSON详解,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. JSON 函数使用 JSON 函数需要导入 json 库:import jso ...

最新文章

  1. js改变iframe链接
  2. (转)rlwrap真是一个好东西
  3. Linux Kernel中断下半部分实现的三种方式
  4. 关于MySQL出现锁等待lock wait timeout exceeded; try restarting transaction 的解决方案
  5. div/span强制不换行
  6. 每日一笑 | 对不起,我还没下班...
  7. cassandra 环境搭建
  8. android 全局 窗口,学习笔记:WindowManager显示Android全局悬浮窗口
  9. rpc wmi 服务不可用_在Windows上修复“RPC服务器不可用”的方法
  10. C++的占位符std::placeholder
  11. ubuntu系统颜色更改
  12. Request 对象
  13. tt按键精灵从入门到精通完整版
  14. 从微软和思科的 IT 服务化转型过程中得到的几点思考
  15. 用EndNote引用文献出现‘参数错误’解决方式
  16. oracle加减乘除怎么写,加减乘除怎么写-加减乘除的名称怎么写-加减乘除的笔画怎么写...
  17. 01、锁相环基本工作原理
  18. Mac版Endnote 20导入中文参考格式Chinese Std GBT7714 (numeric)
  19. 浅谈智能家居安防监控的重要性
  20. 农民工如何拥有500多家加盟连锁店,看他是怎样做到的?

热门文章

  1. ASP.NET长文章分页
  2. Oracle数据库存储过程 ,去除给定字符串中重复的字符串
  3. Log4j具体使用实例
  4. css3中的文字效果
  5. Python、Lua和Ruby——脚本大P.K.
  6. ArchLinux安装配置
  7. [转]解决Sublime Text 2中文显示乱码问题
  8. 对于应聘人工智能相关算法岗来说,顶会论文和算法比赛哪个更重要?
  9. PyTorch(总)---PyTorch遇到令人迷人的BUG与记录
  10. 时间序列-N_LSTM