assert()函数用法总结,assert()函数作用
出发地:http://www..com/ggzss/archive/2011/08/18/2145017.html,谢谢!
assert宏的原型是在assert.h中定义的,它的作用是在条件返回错误时终止程序执行。原型定义:
#include assert.h
void assert( int表达式);
Assert用于计算表达式expression。如果它的值为false(即0),它将首先向stderr打印一条错误消息,然后通过调用abort终止程序。请参阅下列程序清单badptr.c:
#包含stdio.h
#include assert.h
#包含stdlib.h
int main( void)
FILE * fp
fp=fopen( test.txt , w );//以可写方式打开一个文件,如果不存在则创建一个同名文件
断言(FP);//所以这里不会出错
fclose(FP);
fp=fopen( noexitfile.txt , r );//以只读方式打开文件。如果它不存在,打开文件会失败。
断言(FP);//所以这里有一个错误
fclose(FP);//程序永远不会在这里执行
返回0;
}
[root @ localhost error _ process]# gcc bad ptr . c
[root@localhost错误处理]#。/a.out
a.out: badptr.c:14: main:断言“fp”失败。
放弃使用assert()的缺点是频繁调用会极大影响程序性能,增加额外开销。调试后,可以通过在包含# includeassert.h的语句前插入#define NDEBUG来禁用assert调用。示例代码如下:
#包含stdio.h
#定义NDEBUG
#include assert.h
用法和注意事项:
1)检查函数开始时传入参数的合法性,例如:
int resetBufferSize(int nNewSize)
//函数:改变缓冲区大小,
//参数:nNewSize缓冲区的新长度
//返回值:缓冲区的当前长度
//注意:保持原有信息内容不变。nNewSize=0表示清除缓冲区。
assert(nNewSize=0);
assert(nNewSize=MAX _ BUFFER _ SIZE);
}
2)每个断言只测试一个条件,因为同时测试多个条件时,如果断言失败,就无法直观判断哪个条件失败了,比如:
不好:
assert(n offset=0n offset nSize=m _ ninformationsize);
好的:
断言(n offset=0);
assert(no offset nSize=m _ ninformationsize);
3)不能使用改变环境的语句,因为assert只在DEBUG中生效。如果这样做,在程序实际运行时会遇到问题,例如:
错误:
断言(I 100);
这是因为如果出现错误,比如执行前i=100,那么这条语句就不会执行,然后I命令也不会执行。
正确:
断言(I 100);
我;
4)为了逻辑和视觉上的一致性,assert和下面的语句应该是空白的。
5)在某些地方,assert不能代替条件过滤。Assert用于避免明显的错误,而不是处理异常。错误不同于异常。错误不应该出现,例外是不可避免的。c语言的异常可以通过条件判断来处理,其他语言都有自己的异常处理机制。
使用assert的一个很简单的规则是,在方法或函数的开头,如果在方法中间使用,就要仔细考虑是否合适。方法一开始没有启动一个功能流程,一个功能流程执行中出现的问题几乎都是异常的。