C语言中的assert断言,你了解多少呢?
引言
‘ 介绍了assert 是什么,以及assert的优缺点
一、什么assert是断言
assert.h 头文件定义了宏 assert() ,用于在运行时确保程序符合指定条件,如果不符合,就报错终止运行。这个宏常常被称为“断言”。
int a = 10;assert(a == 5); //判断a 是不是等于 5
上面代码在程序运行到这⼀行语句时,验证 a 是不是等于 5,如果a 等于 5,则程序正常执行,如果a 不等于 5,则程序终止运行,并且给出报错信息提示。
如:
#include<stdio.h>
#include<assert.h>int main()
{int a = 10;assert(a == 5);printf("程序正常执行");return 0;
}
运行这段代码会发现,程序报错崩溃了,并且在屏幕上打印出了哪个位置错误;
所以说:使用assert断言,可以用于检查程序在某个特定点上的状态是否符合预期。
二、assert断言介绍
assert() 宏接受⼀个表达式作为参数。如果该表达式为真(返回值⾮零), assert()不会产生任何作用,程序继续运行。如果该表达式为假(返回值为零), assert() 就会报错,在标准错误 流stderr 中写入⼀条错误信息,显示没有通过的表达式,以及包含这个表达式的文件名和行号。
特优点:assert()不仅能自动标识文件和出问题的行号,还有⼀种无需更改代码就能开启或关闭 assert() 的机制。如果已经确认程序没有问题,不需要再做断言,就在 #include <assert.h> 语句的前面,定义⼀个宏NDEBUG 。
例如:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define NDEBUG //定义一个宏#include<assert.h>int main()
{int a = 10;assert(a == 5);printf("程序正常执行");return 0;
}
上面这段代码:
很显然a 不是等于 5 的,assert应该会终止程序的,但因为在#define 前面定义了一个宏NDEBUG,所以assert不会起作用。
如果程序又出现问题,可以移除 #define NDEBUG 指令(或者把它注释掉),再次编译,这样就重新启用了 assert() 语句。
assert() 的缺点是,因为引入了额外的检查,增加了程序的运行时间。
⼀般我们可以在Debug中使用,在Release 版本中选择禁用 assert 就行。