中的断言的用法

更新时间:02-07 教程 由 ぐ夏筱沐 分享

中的断言的用法?

assert是包含在头文件中的宏定义,如下:

#ifdef NDEBUG# define assert(condition) ((void)0)#else# define assert(condition) /*implementation defined*/#endif

由此可见,当NDEBUG已经定义时,assert没有任何作用。反之,condition为零时,assert会终止程序。

通常,debug(调试)模式下不会定义NDEBUG;而release(发布)模式下,会定义NDEBUG。由此可知,assert是用于调试的命令。

一般而言,在编写程序时,我们会假设输入、输出满足一定的条件。由于程序员的疏忽,我们不太可能一次就写对程序。当出现错误时,我们所做的假设可能会不成立。如果我们能将所有假设都用assert进行判断,那么程序出错时,我们能在第一时间发现问题所在。另一方面,我们希望对假设条件的判断不会影响程序的效率。因此,当我们确信程序没有错误时,我们希望assert什么都不做。请看如下示例:

#include templateT multiply(T const& a, T const& b) { return a * b;}templateT 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。

声明:关于《中的断言的用法》以上内容仅供参考,若您的权利被侵害,请联系13825271@qq.com
本文网址:http://www.25820.com/tutorial/14_2188645.html