文章

C 断言

C 断言

描述

C 标准库的 assert.h 头文件提供了一个名为 assert 的宏,它可用于验证程序做出的假设,并在假设为假时输出诊断消息。

定义

  • assert的原型是一个宏,不是函数
1
2
#include <assert.h>
#define assert(expression)  /* implementation-defined */

作用

assert 用于在 调试阶段 检查某个条件是否为真。如果表达式为假(即结果为 0),程序会:

  • 打印出错误信息(包含表达式、文件名和行号)。
  • 调用 abort() 终止程序。

如果表达式为真,程序继续运行,不会有任何影响。

使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <assert.h>

int divide(int a, int b) {
    assert(b != 0); // 检查分母是否为零
    return a / b;
}

int main() {
    int x = 10, y = 2;
    printf("%d / %d = %d\n", x, y, divide(x, y));

    y = 0;
    printf("%d / %d = %d\n", x, y, divide(x, y)); // 触发断言
    return 0;
}

输出结果

1
2
10 / 2 = 5
Assertion failed: (b != 0), function divide, file test.c, line 6.

控制断言

如果在编译时定义了 NDEBUG 宏,那么所有的 assert 调用都会被禁用(相当于什么也不做)。 适用于 发布版(release),避免运行时检查带来的性能开销。

1
gcc -DNDEBUG main.c -o main

这样,assert(b != 0); 会被直接忽略。

本文由作者按照 CC BY 4.0 进行授权