C语言技巧:调试时灵活运用assert

assert意思是断言,常用在程序的DEBUG版本中。

参考资料:C语言技巧:调试时灵活运用assert

1.assert的使用

assert为宏而非函数,原型定义在<assert.h>中,所以使用时需包含该头文件。

void assert( int expression );

assert先计算表达式expression,如果其值为假(即为0),那么它先向标准错误流stderr打印一条出错信息,然后通过调用abort来终止程序运行;值为真(1),assert()不起任何作用。

例子:

假如有一函数:

int fun(int *ptr)

一般我们都会判断一下传入的指针是否为空

int fun(int *ptr){
   
     if(ptr==NULL)    return 0;  ...}

可能还会加一些打印信息,其实这最大的作用也只是为了定位bug,在Release版本中不一定需要,反而对运行速度稍微有些影响(对电脑来说没什么,对单片机还是有影响的)。

使用assert:

#include<assert.h>int fun(int *ptr){
   
     assert(ptr!=NULL);  ...}

我们用assert断言ptr一定不为NULL,假如出现ptr为NULL的情况,程序就会主动中止,然后我们就可以开始Debug了。

在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert。

#define NDEBUG#include<assert.h>

此时assert不会被编译进去,完全不起作用。

2.注意事项

假如有一个函数fun1成功运行返回值为1,错误返回为0。

则,这样的语句很容易出现问题:

assert(fun1());

因为在Release版本中assert不会被编译,fun1函数将不会被调用,所以正确的用法是:

int ret;ret = fun1();assert(ret);

当然,这样在Release版本中编译时可能会有警告:ret set but not used。因为并没有使用ret,设置严格就无法通过编译,此时只需加一句:

int ret;ret = fun1();assert(ret);(void)ret;

即可解决。

猜你喜欢

转载自blog.csdn.net/freestep96/article/details/128763643