本文主要介绍了C中assert()函数用法总结的相关资料,有需要的朋友可以参考一下。
C++ 中assert()函数用法总结
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()的缺点是频繁调用会极大影响程序性能,增加额外开销。调试后,可以通过在包含#include assert.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不能代替条件过滤。
以下是使用断言的几个原则:
(1)使用断言来捕捉不应该发生的非法情况。不要混淆违法情况和错误情况的区别,后者是不可避免的,必须处理。
(2)通过使用断言来确认函数的参数。
(3)写函数的时候,要反复考察,问自己“我打算做什么假设?”的假设一旦确定,就要用断言来检验假设。
(4)一般教科书鼓励程序员设计防错程序,但要记住这种编程风格会掩盖错误。在进行防错编程时,如果确实发生了“不可能”的事情,应该使用断言来报警。
ASSERT()是调试程序时经常使用的宏。当程序运行时,它计算括号中的表达式。如果表达式为FALSE (0),程序将报告错误并终止执行。如果表达式不为0,继续执行下面的语句。这个宏通常决定程序中是否有明显的非法数据。如果有终止程序,会避免严重后果,也容易发现错误。
ASSERT仅在调试版本中有效,如果编译成发布版本,则被忽略。
比较好的在程序中使用assert的地方:
(1)空指针检查。例如,检查函数参数的空指针。可以用这个:assert(指针!=NULL);产生的错误将是这样的:Assertion 'pointer!=((void *)0)'失败.这样,当有一个空指针时,你的程序会退出并给出一个好的错误信息。
(2)检查功能参数的值。比如,如果一个函数只有当它的一个参数foo为正时才能被调用,那么可以在函数的开头写这个:assert(foo 0);这将有助于您检测到函数的误用,同时也会给源代码的读者一个清晰的印象,即这里对函数的参数值有限制。
感谢您的阅读,希望能帮到您,也感谢您对本站的支持!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。