C语言:assert断言(如何让程序在不满足条件时报错)

115 阅读2分钟

简介

assert() 是包含在 assert.h 头文件的宏,用于在运行时确保程序符合指定的条件,如果不符合条件,就报错并终止运行。这个宏被称为“断言

例子:

assert(a > b);

这个代码的作用就是,如果程序运行到该行代码时,不满足 a>b 这个条件的话,程序便会报错并停止运行。

assert() 宏接受一个表达式作为参数。 如果该表达式为真(返回值非零),assert() 不会产生任何作用,程序继续运行; 如果该表达式为假(返回值为零),assert()就会报错,在标准错误流 stderr 中写入一条错误信息,显示没有通过的表达式,以及包含这个表达式的文件名和行号。

如何使用

assert的常见使用场景,有判断变量值、判断指针是否为空指针等。 接下来我们以判断一个指针是否为空指针为例:

#include<stdio.h>
#include<assert.h>
int main()
{
	int* p = NULL;
	assert(p != NULL);
	printf("ok");
	return 0;
}

这个程序在运行到assert()时,会判断变量p是否等于NULL,如果变量p不等于NULL,程序继续运行,否则就会终止运行,并且给出报错信息提示,如图所示: assert报错演示

assert() 在使用中非常友好:因为在一些大型、复杂的程序中,程序员可能会在多处使用assert功能,但是当bug修复后,assert在程序中不在被需要,再次在代码中全部找出并删除则非常麻烦,因此C语言中可以在 #include<assert.h> 前定义一个宏 :#define NDEBUG ,则代码中的assert代码将不再执行 例如,下面这段代码不会报错:

#define NDEBUG
#include<stdio.h>
#include<assert.h>
int main()
{
	int* p = NULL;
	assert(p != NULL);
	printf("ok");
	return 0;
}

当你重新需要使用程序里的assert功能时,将定义注释掉即可重新启用assert功能。 这样在debug版本写有利于程序员排查问题,在Release版本不影响用户使用时程序的效率。

Tip:在vs的集成开发环境中,Release版本的代码会将assert自动优化掉