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:
#includeint fun(int *ptr){ assert(ptr!=null); ...}我们用assert断言ptr一定不为null,假如出现ptr为null的情况,程序就会主动中止,然后我们就可以开始debug了。
在调试结束后,可以通过在包含#include 的语句之前插入 #define ndebug 来禁用assert。
#define ndebug#include此时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加入一些打印信息,更加便于调试,不过一般没什么必要,因为出错时,很多工具和环境都能帮我们定位到出错的地方。
蔚来公布了2020年6月份交付数据
锂电池REACH认证检测
气体检测仪标定使用时的注意事项有哪些
视频和图像识别部分将占据最大的边缘AI软件市场
华为称霸中国市场 苹果逐渐下滑
C语言中assert的使用
LT3598转换器驱动多达6串LED
怎么利用C可变参数和宏定义来实现自己的日志系统
华为5G随行WiFi Pro新体验,不换机也能享受5G高速网络
RISC-V已经到来,避无可避!
DFC型系列伺服放大器原理及常见故障的分析与处理
区块链在保险行业可能会有怎样的成就
新功能发布 | TSMaster工具箱集成开发环境系列3-工具箱调用小程序库
内存条坏了会出现什么状况_内存条坏了如何解决
新唐科技W55RFS27T1B发射器简介
在最流行5.5寸屏幕的智能手机时代,小米6的5.15寸是那种考虑?
如何通过物联网更充分地利用智能照明
制作自己的ci线圈
安科瑞智能电力仪表IEC标准APM系列简介
蓝牙 5.0 时代爆发,真无线蓝牙耳机现状分析