assert那些事

1.第一个断言案例

断言,是宏,而非函数。assert 宏的原型定义在 (C)、(C++)中,其作用是如果它的条件返回错误,则终止程序执行。可以通过定义 NDEBUG 来关闭 assert,但是需要在源代码的开头,include 之前。

  1. void assert(int expression);

对应代码:assert.c

  1. #include <stdio.h>
  2. #include <assert.h>
  3. int main()
  4. {
  5. int x = 7;
  6. /* Some big code in between and let's say x
  7. is accidentally changed to 9 */
  8. x = 9;
  9. // Programmer assumes x to be 7 in rest of the code
  10. assert(x==7);
  11. /* Rest of the code */
  12. return 0;
  13. }

输出:

  1. assert: assert.c:13: main: Assertion `x==7' failed.

可以看到输出会把源码文件,行号错误位置,提示出来!

2.断言与正常错误处理

断言主要用于检查逻辑上不可能的情况。例如,它们可用于检查代码在开始运行之前所期望的状态,或者在运行完成后检查状态。与正常的错误处理不同,断言通常在运行时被禁用。

忽略断言:

在代码开头加上:

  1. #define NDEBUG // 加上这行,则 assert 不可用

对应学习的代码:ignore_assert.c