中的断言的用法?
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
其中定义了multiple(乘法),div(除法)操作。表面上,我们并没有什么错误,不过为了保险起见,我们使用了assert进行验证。结果正如我们希望的,没有任何错误。然而,当我们将a, b的类型改为int时,程序出错了(debug模式)。因为,div的定义其实是有问题的(相信楼主能看出来吧^^)。
总之,每当我们对程序有任何假设、期望,都应该将它转化为assert语句写入程序当中。它能帮助我们定位错误的位置,缩短调试时间,百利而无一害。
PS: 需要注意的是assert应该用于处理程序中的逻辑错误,而不是输入错误。因此判断文件打开是否出错,应该使用异常等错误处理机制,而不是assert。