C 编程/assert.h
外观
< C 编程
(重定向自 C 编程/C 参考/assert.h)assert.h 定义了宏 assert
。该宏可用于验证程序所做的假设,并在该假设为假时打印诊断消息。
在执行时,如果表达式为假(即与 0 相等),assert
将在 stderr
上写入有关失败调用的信息,然后调用 abort()
。它写入 stderr
的信息包括
- 源文件名(预定义宏
__FILE__
) - 源代码行号(预定义宏
__LINE__
) - 源函数(预定义标识符
__func__
)(在 C99 中添加) - 计算结果为 0 的表达式的文本
在 Linux 上使用 gcc 编译的程序的示例输出
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
测试的表达式为假,则 assert
将打印调试信息。
- : 验证程序断言 – 基本定义参考,单一 UNIX® 规范,第 7 版,来自开放组