C 编程/assert.h
外观
< C 编程
assert.h 定义了宏 assert
。这个宏可以用来验证程序中所做的假设,并在假设不成立时输出诊断信息。
执行时,如果表达式为假(即与 0 相等),assert
会将有关失败调用的信息写入 stderr
,然后调用 abort()
。它写入 stderr
的信息包括:
- 源文件名(预定义宏
__FILE__
) - 源行号(预定义宏
__LINE__
) - 源函数(预定义标识符
__func__
)(在 C99 中添加) - 评估为 0 的表达式的文本
使用 gcc 在 Linux 上编译的程序的示例输出
program: program.c:5: main: Assertion `a != 1' failed. Abort (core dumped)
程序员可以在不修改源代码的情况下消除断言:如果在包含 <assert.h>
之前定义了宏 NDEBUG,则 assert
宏被简单地定义为
#define assert(ignore)((void) 0)
因此对程序没有任何影响,甚至不评估其参数。因此,传递给 assert
的表达式不应包含副作用,因为在禁用调试时它们将不会发生。例如
assert(x = gets());
在禁用调试时不会读取一行,也不会给 x 赋值。
C99 标准要求 assert.h
头文件中不声明任何函数。
assert
宏的定义取决于宏 NDEBUG
的状态,该宏未在 assert.h
头文件中定义。宏 NDEBUG
表示不使用调试信息。如果定义了 NDEBUG
,则 assert
被定义为一个什么也不做的表达式。否则,如果 assert
测试的表达式为假,它将打印调试信息。
- : 验证程序断言 – 基础定义参考,单一 UNIX® 规范,第 7 版,来自开放组