断言库(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,编译器会给出一条包含字符串字面量的错误消息;否则,没有任何效果。

示例

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//定义下面的宏可以关闭assert()检查
//#define NDEBUG
#include <assert.h>

int main(int argc, char* argv[])
{
	double x, y, z;
	puts("Enter a pair of numbers (0 0 to quit):");

	while (scanf("%lf%lf", &x, &y) == 2
		&& (x != 0 || y != 0))
	{
		z = x * x - y * y;
		//不满足z>=0条件,则显示报错信息,并自动退出程序
		assert(z >= 0);
		printf("answer is %f\n", sqrt(z));
		puts("Next pair of numbers:");
	}
	puts("Done");

	system("pause");
	return 0; //main()函数退出时会隐式调用exit()
}

运行测试
1111.png

标签: C语言

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号