跳转到内容

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 将打印调试信息。

[编辑 | 编辑源代码]
  • assert.h: 验证程序断言 – 基本定义参考,单一 UNIX® 规范,第 7 版,来自开放组
华夏公益教科书