详解C语言assert宏

简介: 详解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宏是一个很好的代码习惯,希望大家可以规范自己的代码!

目录
相关文章
|
15天前
|
C语言
【C语言】库宏offsetof(结构体成员偏移量计算宏)
【C语言】库宏offsetof(结构体成员偏移量计算宏)
21 0
|
15天前
|
测试技术 C语言 开发者
【C语言】assert断言:保护程序的利器
【C语言】assert断言:保护程序的利器
31 0
|
15天前
|
存储 编译器 Linux
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
|
15天前
|
C语言
C语言assert断言
C语言assert断言
|
15天前
|
编译器 C语言
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
|
2天前
|
安全 编译器 程序员
C语言(16)----预处理中的宏以及预处理指令
C语言(16)----预处理中的宏以及预处理指令
11 2
|
10天前
|
C语言
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)(下)
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)
13 0
|
10天前
|
C语言
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)(上)
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)
24 0
|
10天前
|
自然语言处理 编译器 Linux
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)(下)
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)
8 0
|
10天前
|
程序员 编译器 C语言
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)(中)
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)
21 0