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 20
将N
定义为20,在预处理时把代码中所有的标识符N
替换成20,而#define NDEBUG
把NDEBUG
定义为空,在预处理时把代码中所有的标识符NDEBUG
替换成空。这样的宏定义主要是为了用#ifdef
等预处理指示测试它定义过没有,而不是为了做替换,所以定义成什么值都无所谓,一般定义成空就足够了。
还有另一种办法,不必修改源文件,在编译命令行加上选项-DNDEBUG
就相当于在源文件开头定义了NDEBUG
宏。宏定义和预处理到第 21 章 预处理再详细解释,在第 4 节 “其它预处理特性”将给出assert.h
一种实现。