linux系统下使用assert函数的方法。下面是小编精心收集的资料供大家参考!
步骤如下assert宏的原型定义在《assert.h》中其作用是如果它的条件返回错误则终止程序执行原型定义
#include 《assert.h》
1
void assert( int expression);assert的作用是现计算表达式expression 如果其值为假(即为0)那么它先向stde rr打印一条出错信息
然后通过调用abort来终止程序运行。
请看下面的程序清单ba dpt r.c
#include 《stdio.h》
#include 《assert.h》
#include 《stdlib.h》
2
int main(void)
{
FILE*fp;fp=fope n(test.txt w);//以可写的方式打开一个文件如果不存在就创建一个同名文件assert(fp); //所以这里不会出错fc lo s e(fp);fp=fo pen(noexitfile.txt r);//以只读的方式打开一个文件如果不存在就打开文件失败
3
assert(fp); //所以这里出错fc lo s e(fp); //程序永远都执行不到这里来return 0;
}
[root@localhost error_process]#gcc badptr.c
[root@localhost erro r_process]# 。 /a.outa.out badptr.c:14 main Asse rtio n `fp‘faile d.
4
已放弃
使用assert的缺点是频繁的调用会极大的影响程序的性能增加额外的开销。
在调试结束后可以通过在包含#include 《assert.h》的语句之前插入#define NDEBUG来禁用assert调用示例代码如下
#include 《stdio.h》
#define NDEBUG
#include 《assert.h》
5
用法总结与注意事项
1)在函数开始处检验传入参数的合法性如int resetBuffe rSize(int nNewSize)
{
//功能改变缓冲区大小
//参数 nNewSize缓冲区新长度
6
//返回值缓冲区当前长度
//说明保持原信息内容不变nNewSize 《=0表示清除缓冲区assert(nNewSize 》 =0);assert(nNewSize 《=MAX_BUFFER_SIZE);
。 。 。
}
2)每个assert只检验一个条件 因为同时检验多个条件时如果断言失败无法直观的判断是哪个条件失败
7
不好 assert(nOffset》=0&&nOffset+nS ize
《=m_nInfomationSize);
好 assert(nOffset 》 =0);assert(nOffset+nSize 《=m_nInfomationSize);
3)不能使用改变环境的语句 因为assert只在DEBUG个生效如果这么做会使用程序在真正运行时遇到问题
错误 assert(i++ 《 100)
这是因为如果出错 比如在执行之前i=100那么这条语句就不会执行那么i++这条命令就没有执行。
8
正确 assert(i 《 100)i++;
4)assert和后面的语句应空一行 以形成逻辑和视觉上的一致感
5)有的地方 assert不能代替条件过滤
9
官方网站:点击访问酷番云官网活动方案:优惠方案一(限时秒杀专场)有需要海外的可以看看,比较划算29月,建议年付划算,月付续费不同价,这个专区。国内节点可以看看,性能高IO为主, 比较少见。平常一般就100IO 左右。优惠方案二(高防专场)高防专区主要以高防为主,节点有宿迁,绍兴,成都,宁波等,节点挺多,都支持防火墙自助控制。续费同价以下专场。 优惠方案三(精选物理机)西南地区节点比较划算,赠送5...
艾云怎么样?艾云是一家去年年底成立的国人主机商家,商家主要销售基于KVM虚拟架构的VPS服务,机房目前有美国洛杉矶、圣何塞和英国伦敦,目前商家推出了一些年付特价套餐,性价比非常高,洛杉矶套餐低至85元每年,给500M带宽,可解奈飞,另外圣何塞也有特价机器;1核/1G/20G SSD/3T/2.5Gbps,有需要的朋友以入手。点击进入:艾云官方网站艾云vps促销套餐:KVM虚拟架构,自带20G的防御...
这两天Linode发布了十八周年的博文和邮件,回顾了过去取得的成绩和对未来的展望。作为一家运营18年的VPS主机商,Linode无疑是有一些可取之处的,商家提供基于KVM架构的VPS主机,支持随时删除(按小时计费),可选包括美国、英国、新加坡、日本、印度、加拿大、德国等全球十多个数据中心,所有机器提供高出入网带宽,最低仅$5/月($0.0075/小时)。This month marks Linod...