assert(笔记)

来源:互联网 发布:中国人长相知乎 编辑:程序博客网 时间:2024/04/28 06:08

1、assert是头文件assert.h中的一个宏定义判断值为真,则当什么事都没发生过,继续往下执行,判断值为假,则报错退出程序:

代码中适当的地方使用断言(Assertion)可以有效地帮助我们测试程序。也许有人会问:我们用几个测试函数来测试binarysearch,那么这几个测试函数又用什么来测试呢?在实际工作中我们要测试的代码绝不会像binarysearch这么简单,而我们编写的测试函数往往都很简单,比较容易保证正确性,也就是用简单的、不容易出错的代码去测试复杂的、容易出错的代码。

测试代码只在开发和调试时有用,如果正式发布(Release)的软件也要运行这些测试代码就会严重影响性能了,如果在包含assert.h之前定义一个NDEBUG宏(表示No Debug),就可以禁用assert.h中的assert宏定义,这样代码中的所有assert测试都不起作用了:

#define NDEBUG#include <stdio.h>#include <assert.h>...

注意NDEBUG和我们以前使用的宏定义有点不同,例如#define N 20N定义为20,在预处理时把代码中所有的标识符N替换成20,而#define NDEBUGNDEBUG定义为空,在预处理时把代码中所有的标识符NDEBUG替换成空。这样的宏定义主要是为了用#ifdef等预处理指示测试它定义过没有,而不是为了做替换,所以定义成什么值都无所谓,一般定义成空就足够了。

还有另一种办法,不必修改源文件,在编译命令行加上选项-DNDEBUG就相当于在源文件开头定义了NDEBUG宏。宏定义和预处理到第 21 章 预处理再详细解释,在第 4 节 “其它预处理特性”将给出assert.h一种实现。