C语言中assert的使用

嵌入式技术

1335人已加入

描述

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

1.assert的使用

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

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 的语句之前插入 #define NDEBUG 来禁用assert。

#define NDEBUG
#include< assert.h >

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

2.注意事项

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

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

assert(fun1());

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

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

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

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

即可解决。

我们也可以自己定义自己的ASSERT加入一些打印信息,更加便于调试,不过一般没什么必要,因为出错时,很多工具和环境都能帮我们定位到出错的地方。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分