嵌入式技术
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 ret;
ret = fun1();
assert(ret);
当然,这样在Release版本中编译时可能会有警告:ret set but not used。因为并没有使用ret,设置严格就无法通过编译,此时只需加一句:
int ret;
ret = fun1();
assert(ret);
(void)ret;
即可解决。
我们也可以自己定义自己的ASSERT加入一些打印信息,更加便于调试,不过一般没什么必要,因为出错时,很多工具和环境都能帮我们定位到出错的地方。
全部0条评论
快来发表一下你的评论吧 !