前言:我们经常在写代码时,发现一些大牛的代码中总有一句assert(表达式),经过在网上的学习,笔者也浅显的了解了assert的相关知识,assert一般用于规范代码,避免不必要的错误,下面与大家分享。
1.assert宏基本介绍
-
原型:
-
作用:
简单来说,就是如果espression的值为0,或false(比如指针为NULL)时,就会调用abort函数来终止程序的运行,并告诉你具体的错误信息,比如如果判断为0,以下列格式输出错误信息
2.常见用法
-
检查函数参数是否错误(最常见的是传递NULL)
在传递函数参数时,经常会出现传递指针变量的情况(地址),一不注意,就会发生传递空指针的情况,这种情况下传递的函数参数是错误的,所以需要添加assert来规避这个错误。
代码1:一个简单的代码
代码2:my_strcpy的实现
//简化代码 标准代码,要考虑到所有可能出现错误的地方,比如指针经常传递NULL
char* my_strcpy(char* dest, const char* src)
{
assert(src);//等价于assert(src!=NULL)
assert(dest != NULL);
char* ret = dest;
while (*dest++ = *src++);//后置加,先把赋值后的结果先被while使用,再++
return ret;
}
int main()
{
/*char arr1[] = "hello world";*/
char *p=NULL;
char arr2[] = "xxxxxxxxxxx";
printf("%s\n", my_strcpy(arr2, p));
return 0;
}
-
检查数组索引
/*定义一个全局的数组*/
static int my_array[10] = { 1,2,3,4,5,6,7,8,9,10 };
int get_array_index(int index)
{
/*判断数组索引是否越界*/
assert(index >= 0 && index < 10);//索引的值只能在0和9之间
return my_array[index];
}
int main()
{
/*目的:查找my_array数组中对应位置的元素,5就是查找第五个元素*/
int x = get_array_index(5);
int y = get_array_index(15);//超过索引,所以会报错
return 0;
}
3.assert宏的注意事项
1.#define NEDBUG
我们使用assert主要是为了发现并减少编程时出现的错误,而不是在用户端或运行时显示错误,所以一般在程序员调试完毕之后要添加#define NEDBUG 来终止所有assert的功能,也就是说所有的assert宏都失效了。为什么这么做呢,主要有以下几点原因
- assert一般用于捕获编程时出现的错误或异常情况,在实际运行中会影响程序性能和用户体验感;
- 减少发布后程序的体积,提高程序运行速度,减少占用的系统空间;
- 避免敏感数据的泄露(因为报错的信息十分详细,有文件名,具体代码位置);