原型是: void assert( int expression);
如果宏的参数求值结果为非零值,则不做任何操作(no action);如果是零值,用宽字符(wide characters)在stderr上打印诊断消息,然后调用abort()。诊断消息包括:
-
源文件名字 (在stdlib.h中声明的宏__FILE__的值)
-
所在的源文件的行号(在stdlib.h中声明的宏__LINE__的值)
-
所在的函数名 (在stdlib.h中声明的宏__func__的值),这是 C99新增的特性
-
求值结果为0的表达式
程序可以屏蔽掉所有的assert()而无需修改源代码。
方法1:编译时添加宏定义的命令行选项,定义NDEBUG宏
gcc -o abc abc.c -DNDEBUG
-D 设置宏。-U用于取消宏。
-D TRUE=true,等价于:#define TRUE true;
-D macro,等价于在头文件中定义:#define macro 1,实际上也达到了定义:#define macro的目的
gcc -DYES -UYES -o helloyesno hello.c 等于没有设置宏。
方法2:在源程序程序引入<assert.h>之前就使用#define NDEBUG来定义宏。被屏蔽的assert()甚至不对传递给它的参数表达式求值,因此使用assert()时其参数表达式不能有副作用(side-effects).