跳至内容

C 编程/assert.h

来自维基教科书,开放的书籍,构建开放的世界

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 测试的表达式为假,它将打印调试信息。

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