C语言断言assert详解
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详解相关推荐
- 断言(assert)详解
目录 一.assert定义 二.用法总结与注意事项 四.以下是使用断言的几个原则: 一.assert定义 我一直以为 assert 仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错 ...
- java 断言 assert 详解:断言开启、断言使用
java中的断言Assert的使用 一.背景 二.如何判断是否开启了断言 三.开启断言 四.断言的使用 方法一.assert <boolean表达式> 方法二.assert <boo ...
- php7 断言,PHP 断言(assert) 详解
PHP 中的断言常用于调试,检查一个表达式或语句是否为 FALSE.本文带你重新认识 PHP assert() 函数的神(Qi)通(Yin)广(Ji)大(Qiao). 本文基于 PHP Version ...
- php 断言,PHP 断言(assert) 详解
PHP 中的断言常用于调试,检查一个表达式或语句是否为 FALSE.本文带你重新认识 PHP assert() 函数的神(Qi)通(Yin)广(Ji)大(Qiao). 本文基于 PHP Version ...
- (转)C语言位运算详解
地址:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html C语言位运算详解 作者:911 说明:本文参考了http://www2.ts ...
- R语言基础知识详解及概括
R语言基础知识详解及概括 目录 R语言基础知识详解及概括 R数据可视化示例 R语言进行数据创建
- c语言练习题及答案)(1),c语言练习题(带详解答案)1.pdf
c语言练习题(带详解答案)1 (-2) -1: 一单项选择题 /为求商运算符,该运算符能够对整型.字符.浮点等类型的数 据进行运算,5/2 2 1.(A )是构成C语言程序的基本单位. 11.如果 i ...
- python语言的格式框架_django框架模板语言使用方法详解
本文实例讲述了django框架模板语言使用方法.分享给大家供大家参考,具体如下: 模板功能 作用:生成html界面内容,模版致力于界面如何显示,而不是程序逻辑.模板不仅仅是一个html文件,还包括了页 ...
- C语言再学习 -- 详解C++/C 面试题 2
(经典)C语言测试:想成为嵌入式程序员应知道的0x10个基本问题. 参看:嵌入式程序员面试问题集锦 1.用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define ...
- python自动解析json_Python语言解析JSON详解
本文主要向大家介绍了Python语言解析JSON详解,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. JSON 函数使用 JSON 函数需要导入 json 库:import jso ...
最新文章
- js改变iframe链接
- (转)rlwrap真是一个好东西
- Linux Kernel中断下半部分实现的三种方式
- 关于MySQL出现锁等待lock wait timeout exceeded; try restarting transaction 的解决方案
- div/span强制不换行
- 每日一笑 | 对不起,我还没下班...
- cassandra 环境搭建
- android 全局 窗口,学习笔记:WindowManager显示Android全局悬浮窗口
- rpc wmi 服务不可用_在Windows上修复“RPC服务器不可用”的方法
- C++的占位符std::placeholder
- ubuntu系统颜色更改
- Request 对象
- tt按键精灵从入门到精通完整版
- 从微软和思科的 IT 服务化转型过程中得到的几点思考
- 用EndNote引用文献出现‘参数错误’解决方式
- oracle加减乘除怎么写,加减乘除怎么写-加减乘除的名称怎么写-加减乘除的笔画怎么写...
- 01、锁相环基本工作原理
- Mac版Endnote 20导入中文参考格式Chinese Std GBT7714 (numeric)
- 浅谈智能家居安防监控的重要性
- 农民工如何拥有500多家加盟连锁店,看他是怎样做到的?