永发信息网

C++中的断言的用法。ASSERT

答案:3  悬赏:70  手机版
解决时间 2021-04-07 03:21
C++中的断言的用法。ASSERT
最佳答案
assert是包含在头文件中的宏定义,如下:
#ifdef NDEBUG
#    define assert(condition) ((void)0)
#else
#    define assert(condition) 
#endif由此可见,当NDEBUG已经定义时,assert没有任何作用。反之,condition为零时,assert会终止程序。
通常,debug(调试)模式下不会定义NDEBUG;而release(发布)模式下,会定义NDEBUG。由此可知,assert是用于调试的命令。
一般而言,在编写程序时,我们会假设输入、输出满足一定的条件。由于程序员的疏忽,我们不太可能一次就写对程序。当出现错误时,我们所做的假设可能会不成立。如果我们能将所有假设都用assert进行判断,那么程序出错时,我们能在第一时间发现问题所在。另一方面,我们希望对假设条件的判断不会影响程序的效率。因此,当我们确信程序没有错误时,我们希望assert什么都不做。请看如下示例:
#include 

template
T multiply(T const& a, T const& b) {
    return a * b;
}

template
T div(T const& a, T const& b) {
    return a / b;
}

int main() {
    double const a = 1, b = 2;
    assert(multiply(div(a, b), b) == a);

    return 0;
}其中定义了multiple(乘法),div(除法)操作。表面上,我们并没有什么错误,不过为了保险起见,我们使用了assert进行验证。结果正如我们希望的,没有任何错误。然而,当我们将a, b的类型改为int时,程序出错了(debug模式)。因为,div的定义其实是有问题的(相信楼主能看出来吧^^)。
总之,每当我们对程序有任何假设、期望,都应该将它转化为assert语句写入程序当中。它能帮助我们定位错误的位置,缩短调试时间,百利而无一害。


PS: 需要注意的是assert应该用于处理程序中的逻辑错误,而不是输入错误。因此判断文件打开是否出错,应该使用异常等错误处理机制,而不是assert。

全部回答
把一个表达式传给assert函数 如果表达式不为真就会中断
通常用在定位错误的时候

假如不写assert,调试的时候问题未必会暴露出来。此时就如问题所描述的,在调试的时候没事,可是到执行的时候出问题了你又没解决机制……


比如说
FILE*fp;
fp=fopen("错误的文件名?!","w+");
不管文件存不存在,代码都会继续往下运行,问题一时半会不会暴露,有的时候说不定这次调试就没看出问题……
如果写成
FILE*fp;
fp=fopen("错误的文件名?!","w+");
assert(fp!=NULL);
在打开文件失败的时候就会立刻发现断言失败,调试中断,要求立刻修改代码,解决问题,这样才能在实际中不会出问题……
追问这样说,ASSERT是针对那些不是完整项目,只是一部分,只能调试检测错误,而不能运行测试的地方?
比较适合多个人合作的时候?
比如我现在就是自己在写个小程序,其实是完全没有必要的喽,可以直接运行一下就知道有没有问题了呗。
毕竟如果fp=NULL的时候,运行的时候肯定会崩溃或者报错。追答如果fp=NULL的时候,运行的时候肯定会崩溃或者报错


如果代码多,未必执行到这个分支,就未必了。比如这一段代码用于在出现内存耗尽的时候把一部分数据交换到硬盘文件,假如调试的时候内存没有耗尽,根本没用到这个文件,就不会出错。或者用到了,但是是在跟 fopen 相差十万八千里的另一段代码里面用的,这样排查就很不容易


不过技巧、约定都是用于大项目的(也不一定是多个人合作),代码一眼就能看完的情况下,认为完全没有必要大概也没关系
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
手游诛仙挂机疲劳后,打副本有经验装备吗?
汽车导航回收一般多少钱一个?
北京的社区医院招应届本科毕业生吗?
听说斯巴鲁的水平对置发动机和保时捷用的一个
如何在CAD中进行地类面积的注记
要去科达上,但学籍在淇滨高中,怎么办?怎么
what's it to you 这句话一般用在什么口
刚才不小心删了 10点45分 刚才摇了个风火家人
世纪华联超市长兴店这个地址在什么地方,我要
vivox5play帐号锁怎么解
在下罗大学旁边开一间20间旅馆一年能赚多少钱
碧潭飘雪冲泡有什么讲究
实木家具桌子盖什么好 桌子面盖什么比较好?
2x+5y=-21,x+3y=8二元一次方程组怎么解
29岁为什么不宜结婚,听很多人这样说,但不知
推荐资讯
怎么找到DHV代理团队?
茂名交警机动大队大队长是谁
win10如何卸载autodesk materrial library ba
豫清斋羊肉馆在什么地方啊,我要过去处理事情
大家好 我有一个18650电池 型号是:MOLI FSPE
蓬蓬勃勃的意思
自然界存在许多循环现象,下列四种循环所发生
佳能5d3底座上面的号码是什么意思
为什么正常安装CAD2004后,双击cad图标没有反
林妙可-我爱你,北京的朗诵台词
吉林工商管理学院和吉林工商学院是一个学校吗
全日制专升本是什么,专升本有全日制的吗
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?