下面介绍一下assert在C语言中的使用。有需要的朋友可以参考一下。
assert宏的原型是在assert.h中定义的,它的作用是在条件返回错误时终止程序执行。原型定义:
#include assert.h
void assert( int表达式);
Assert用于计算表达式。如果它的值为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
宏名:断言
能量:测试一个条件并可能终止程序。
方法:void assert(int test);
程序例:
#include assert.h
#包含stdio.h
#包含stdlib.h
结构项目{
int键;
int值;
};
/*向列表中添加项目,确保列表不为空*/
void additem(struct ITEM * ITEM ptr){
assert(itemptr!=NULL);
/*将项目添加到列表*/
}
int main(void)
{
additem(空);
返回0;
}
assert() 宏用法
注意:assert是宏,而不是函数。在C的assert.h头文件中。
assert宏的原型是在assert.h中定义的,它的作用是在条件返回错误时终止程序执行。原型定义:
#include assert.h
void assert( int表达式);
assert的作用是先计算表达式。如果它的值为false(即0),它首先将错误消息打印到标准错误流stderr,然后调用abort来终止程序。否则,assert()不起作用。宏assert()一般用于确认程序的正常运行,其中只有当表达式构造无误时才为真值。调试完成后,没有必要从源代码中删除assert()语句,因为在定义宏NDEBUG时,宏assert()的定义是空的。
用法总结与注意事项:
1)在函数开始时检查传入参数的合法性。
比如:
int resetBufferSize(int nNewSize)
{
//函数:改变缓冲区大小,
//参数:nNewSize缓冲区的新长度
//返回值:缓冲区的当前长度
//注意:保持原有信息内容不变。nNewSize=0表示清除缓冲区。
assert(nNewSize=0);
assert(nNewSize=MAX _ BUFFER _ SIZE);
.
}
2)每个断言只检查一个条件,因为同时检查多个条件时,如果断言失败,就无法直观判断哪个条件失败。
bad:assert(n offset=0n offset size=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不能代替条件过滤。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。