详解C语言assert宏

前言:我们经常在写代码时,发现一些大牛的代码中总有一句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一般用于捕获编程时出现的错误或异常情况,在实际运行中会影响程序性能和用户体验感;
  • 减少发布后程序的体积,提高程序运行速度,减少占用的系统空间;
  • 避免敏感数据的泄露(因为报错的信息十分详细,有文件名,具体代码位置);

        2.使用一定要包含头文件  #include <assert.h>

4.总结:assert可以帮助我们规范代码,帮助程序员及时捕获错误,在适当位置添加assert宏是一个很好的代码习惯,希望大家可以规范自己的代码!

猜你喜欢

转载自blog.csdn.net/Mylvzi/article/details/130821734