一、assert的简单定义
1. 头文件
assert是一个宏,通常定义在头文件assert.h中,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报错终⽌运⾏。这个宏常常被称为“断⾔”。
2.assert宏的基本定义如下:
#include <assert.h>
void assert(int expression);
但实际上,assert的实现要复杂一些,它会在编译时检查是否定义了宏NDEBUG。如果定义了NDEBUG,那么assert宏在预处理阶段就会被忽略,不会进行任何操作。这通常用于发布版本的程序,以避免assert带来的性能开销和不必要的检查。
3.常用语句
assert(p!=NULL)。
这个语句验证变量 p 是否等于 NULL 。如果确实不等于 NULL ,程序继续运⾏,否则就会终⽌运⾏,并且给出报错信息提⽰。
二、用处
assert() 宏接受⼀个表达式作为参数。如果该表达式为真(返回值⾮零), assert() 不会产⽣
任何作⽤,程序继续运⾏。如果该表达式为假(返回值为零), assert() 就会报错,在标准错误
流 stderr 中写⼊⼀条错误信息,显⽰没有通过的表达式,以及包含这个表达式的⽂件名和⾏号。
三、利与弊
好处
assert() 的使⽤对程序员是⾮常友好的,使⽤ assert() 有⼏个好处:它不仅能⾃动标识⽂件和出问题的⾏号,还有⼀种⽆需更改代码就能开启或关闭 assert() 的机制。如果已经确认程序没有问
题,不需要再做断⾔,就在 #include <assert.h> 语句的前⾯,定义⼀个宏 NDEBUG 。
坏处
assert() 的缺点是,因为引⼊了额外的检查,增加了程序的运⾏时间。
⼀般我们可以在 Debug 中使⽤,在 Release 版本中选择禁⽤ assert 就⾏,在 VS 这样的集成开发环境中,在 Release 版本中,直接就是优化掉了。这样在debug版本写有利于程序员排查问题,在 Release 版本不影响⽤⼾使⽤时程序的效率。
四、简单代码展示
#include <stdio.h>
#include <assert.h>
int main() {
int x = 5;
assert(x > 0); // 如果x不大于0,程序将终止并输出错误信息
// ... 其他代码 ...
return 0;
}
#include <stdio.h>
#include <assert.h>
int main() {
int x = 5;
int y = 0;
// 检查x是否大于0,如果是,则继续执行;如果不是,则程序将终止
assert(x > 0);
// 假设y不应该为0,如果为0则是一个错误
// 这里的assert将触发,因为y等于0
assert(y != 0);
// 如果上面的assert不触发,程序将执行到这里
printf("Both assertions passed, program continues.\n");
return 0;
}
在上面的代码中,我们定义了两个整数变量x和y。第一个assert检查x是否大于0,由于x被初始化为5,所以这个条件是真的,程序将正常执行。然而,第二个assert检查y是否不等于0,由于y被初始化为0,这个条件是假的,因此assert将触发。