c库函数详解——assert

转载 2010年05月22日 21:27:00

c库函数详解——assert
函数名: assert
功  能: 测试一个条件并可能使程序终止
用  法: void assert(int test);
程序例:
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
struct ITEM {
   int key;
   int value;
};
/* add item to list, make sure list is not null */
void additem(struct ITEM *itemptr) {
   assert(itemptr != NULL);
   /* add item to list */
}
int main(void)
{
   additem(NULL);
   return 0;
}

 


assert() 函数用法
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;
}
[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不能代替条件过滤


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/douwashi/archive/2007/12/03/1913742.aspx

Linux C 中断言assert()使用简介

assert()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句,它的作用是终止程序...
  • zqixiao_09
  • zqixiao_09
  • 2016年05月15日 16:25
  • 4844

C++面试常见的几个库函数详解

strcpy() 原型声明:char strcpy(char dest, const char *src);  功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间  ...
  • zang141588761
  • zang141588761
  • 2016年03月04日 16:26
  • 566

C语言标准库函数与功能讲解

1 数学函数 数学库函数声明在 math.h 中,主要有: abs(x) 求整型数x 的绝对值 cos(x) x(弧度)的余弦 fabs(x) 求浮点数x 的绝对值 ceil(x) 求不小于...
  • caisini_vc
  • caisini_vc
  • 2014年06月04日 17:09
  • 1773

c语言之assert的使用

assert 作用
  • wxwd1
  • wxwd1
  • 2014年09月08日 14:10
  • 1834

C语言中自己写几个简单的库函数

在C语言的学习中我们总会遇到一些看似看简单的问题,比如求字符串的长度,判断一个字符串中是否包含一个给定的子字符串,又或者怎么将一个字符串逆序输出,甚至是部分逆序输出,这些问题看似都挺简单,因为我们早已...
  • Loving_Forever_
  • Loving_Forever_
  • 2016年04月06日 21:39
  • 2625

C语言再学习-- assert 断言宏

描述: 断言 assert 是仅在 Debug 版本起作用的宏,它用于检查“不应该”发生的情况。 C 库宏 void assert(int expression) 允许诊断信息被写入到标准错误文件...
  • qq_29350001
  • qq_29350001
  • 2017年01月15日 14:07
  • 1430

c/c++中assert()函数的用法

assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include assert.h> void assert( int expression );   as...
  • snowsnowsnow1991
  • snowsnowsnow1991
  • 2016年03月28日 11:03
  • 1366

c语言部分库函数,代码实现,以及细节理解

代码来自:   http://blog.csdn.net/v_JULY_v
  • wangyaninglm
  • wangyaninglm
  • 2014年11月22日 21:32
  • 1368

C++拾遗:断言错误assert()函数用法总结

assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include assert.h> void assert( int expression ); ...
  • top_along
  • top_along
  • 2014年06月20日 11:08
  • 1669

C语言库函数大全

C语言库函数手册分类函数,所在函数库为 ctype.hint isalpha(int ch)  若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0int isalnum(int ch...
  • YANFAN0916
  • YANFAN0916
  • 2011年05月27日 16:25
  • 4214
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c库函数详解——assert
举报原因:
原因补充:

(最多只允许输入30个字)