断言库(assert.h)

作者:追风剑情 发布于:2020-3-23 14:06 分类:C

assert.h头文件支持的断言库是一个用于辅助调试程序的小型库。它由assert()宏组成,接受一个整型表达式作为参数。如果表达式求值为假(非零),assert()宏就在标准错误流(stderr)中写入一条错误信息,并调用abort()函数终止程序(abort()函数的原型在stdlib.h头文件中)。assert()宏是为了标识出程序中某些条件为真的关键位置,如果其中的一个具体条件为假,就用assert()语句终止程序。通常,assert()的参数是一个条件表达式或逻辑表达式。如果assert()中止了程序,它首先会显示失败的测试、包含测试的文件名和行号。

如果认为已经排除了程序的bug,就可以把#define NDEBUG宏定义在#include <assert.h>前面,并重新编译程序,这样编译器就会禁用文件中的所有assert()语句。

C11新增了static_assert宏,展开为_Static_assert。_Static_assert是一个关键字,被认为是一种声明形式。它以这种方式提供一个编译时检查:
_Static_assert(常量表达式,字符串字面量);
如果对常量表达式求值为0,编译器会给出一条包含字符串字面量的错误消息;否则,没有任何效果。

示例

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. //定义下面的宏可以关闭assert()检查
  6. //#define NDEBUG
  7. #include <assert.h>
  8.  
  9. int main(int argc, char* argv[])
  10. {
  11. double x, y, z;
  12. puts("Enter a pair of numbers (0 0 to quit):");
  13.  
  14. while (scanf("%lf%lf", &x, &y) == 2
  15. && (x != 0 || y != 0))
  16. {
  17. z = x * x - y * y;
  18. //不满足z>=0条件,则显示报错信息,并自动退出程序
  19. assert(z >= 0);
  20. printf("answer is %f\n", sqrt(z));
  21. puts("Next pair of numbers:");
  22. }
  23. puts("Done");
  24.  
  25. system("pause");
  26. return 0; //main()函数退出时会隐式调用exit()
  27. }

运行测试
1111.png

标签: C语言

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号