assert断言
一·定义
assert.h头文件定义了宏assert(),用于在运行时确保程序符合指定条件,如果不符合,就报错终止运行,这个宏常常被称为断言
二·格式
assert(p!=NULL);
三·具体执行
assert()宏接受一个表达式作为参数,若该表达式为真(返回值非零),assert()不会产生任何作用,程序继续运行,否则终止并给出报错信息提示(表达式的文件名和行号)
四·优点
优点1:能自动标识文件和出问题的行号
优点2:无需更改代码就能开启或关闭assert()的机制(如果已经确定程序没有问题,不需要再做断言,就在#include <assert.h>语句前定义一个宏NDEBUG以禁用assert断言)
例:
#include <stdio.h>
#define NDEBUG
#include <assert.h>
size_t my_strlen(const char* str)
{
size_t count = 0;
assert(str != NULL);
while (*str != '\0')
{
str++;
count++;
}
return count;
}
int main()
{
char arr[] = "hello world";
size_t len = my_strlen(arr);
printf("%zd", len);
return 0;
}
五·缺点
assert()引入了额外的检查,增加了程序的运行时间
可在Debug中使用,在Release版本中选择禁用assert
这样在Dubug版本有利于程序排查问题
在Release版本中不影响用户使用时程序的效率
使用assert()断言能提高代码的鲁棒性
鲁棒性
“我会从程序的正确性和鲁棒性两方面检验代码的质量”
------田超(微软,SDE II)
鲁棒:Robust音译
鲁棒性指在异常和危险情况下系统生存的能力,鲁棒性越高,代码越抗打
例:计算机软件在输入错误,磁盘故障,网络过载或有意攻击情况下,能否不死机,不崩溃
此外,鲁棒性也指控制系统在一定(结构,大小)的参数摄动下,维持它某些性能的特性
所以,写出高质量的代码,从运用assert断言做起!