<assert.h> 是 C 语言标准库中的断言(Assertion)处理头文件,提供了 assert() 宏,可用于调试代码,帮助开发者在程序运行时检查假设条件是否成立。如果 assert() 断言失败,程序将终止,并输出错误信息。


📖 目录

  1. assert.h 简介
  2. assert() 语法及用法
  3. 示例代码
  4. NDEBUG 预处理宏
  5. 适用场景
  6. 参考资料

1️⃣ <assert.h> 简介

  • 作用:用于程序调试,在运行时检查表达式是否成立。
  • 特点
    • 断言失败时,程序终止,并输出错误信息。
    • 仅在开发和调试阶段使用,发布版本时通常禁用断言。
    • NDEBUG 预处理宏可关闭 assert(),避免影响性能。

2️⃣ assert() 语法及用法

#include <assert.h>
void assert(expression);

  • 参数
    • expression(表达式):如果表达式的值为 false(0),程序终止并显示错误信息。
  • 行为
    • 断言通过(表达式为 true),程序继续运行。
    • 断言失败(表达式为 false),程序终止,并打印错误信息: Assertion failed: expression, file filename, line line_number
    • 断言失败的文件名、行号可帮助快速定位错误。

3️⃣ 示例代码

📌 基本示例

#include <stdio.h>
#include <assert.h>

int divide(int a, int b) {
    assert(b != 0);  // 断言:除数不能为 0
    return a / b;
}

int main() {
    int x = 10, y = 0;
    printf("Result: %d\n", divide(x, y));  // 断言失败,程序终止
    return 0;
}

输出(断言失败)

Assertion failed: b != 0, file test.c, line 6

🔹 解释

  • y = 0 时,assert(b != 0) 失败,程序终止。
  • 通过 assert(),可以防止非法输入快速发现错误

4️⃣ NDEBUG 预处理宏

assert() 仅在调试模式下有效,若定义 NDEBUG,则 assert() 语句被忽略,不会执行。

📌 使用 NDEBUG 关闭断言

#include <stdio.h>
#include <assert.h>

#define NDEBUG  // 禁用 assert()
#include <assert.h>  // 需要在 NDEBUG 定义后包含

int main() {
    int num = 5;
    assert(num > 10);  // 由于定义了 NDEBUG,这行代码不会执行
    printf("Program continues...\n");
    return 0;
}

输出

Program continues...

🔹 解释

  • #define NDEBUG 禁用了所有 assert(),即使断言条件不成立,程序也不会终止。
  • 适用于发布版本,避免影响性能。

5️⃣ 适用场景

assert() 常用于: ✅ 参数检查:确保传入参数符合预期。
逻辑验证:验证关键变量或状态。
除错调试:在开发阶段快速发现错误。

📌 适用示例

✅ 检查指针是否为空

#include <stdio.h>
#include <assert.h>

void printMessage(const char *msg) {
    assert(msg != NULL);  // 确保指针不为空
    printf("Message: %s\n", msg);
}

int main() {
    printMessage(NULL);  // 断言失败
    return 0;
}

输出

Assertion failed: msg != NULL, file test.c, line 6

✅ 确保数组索引合法

#include <stdio.h>
#include <assert.h>

void accessArray(int arr[], int index, int size) {
    assert(index >= 0 && index < size);  // 断言索引合法
    printf("Element: %d\n", arr[index]);
}

int main() {
    int arr[] = {1, 2, 3};
    accessArray(arr, 5, 3);  // 断言失败
    return 0;
}

输出

Assertion failed: index >= 0 && index < size, file test.c, line 6


6️⃣ 参考资料

📖 C 标准库官方文档 – assert.h
📖 GNU C Library – assert
📖 ISO C 标准(PDF)


📌 总结

特点说明
assert() 作用调试阶段检查表达式是否为 true
assert() 失败终止程序,并输出文件名、行号和失败条件
NDEBUG 作用关闭 assert(),适用于发布版本
适用场景断言参数合法性、检查数组索引、检测指针空值等
⚠️ 注意assert() 不能代替错误处理,只应用于调试阶段

🚀 使用 assert.h 可以大幅提升代码的可靠性和可读性,特别适用于调试和测试阶段!