小工具知识网

当前位置: 首页 > 行业知识 > assert断言

行业知识

assert断言

2026-10-26 02:17:43 来源:互联网转载

1.assert断言介绍

1.使用方法

assert.h 头头件定义了宏 assert() ,用于在运行时确保程序符合指定条件,如果不符合,就报

错终止运行。这个宏常常被称为“断言”。

int main(){ int*p=NULL; if(p!=NULL) {  *p=100; } return 0;}

例如在以上代码中就可以用assert断言来替代if语句 

#includeint main(){ int*p=NULL; assert(p!=NULL) *p=100; return 0;}

assert() 宏接受⼀个表达式作为参数。如果该表达式为真(返回值非零), assert() 不会产生

任何作用,程序继续运行。如果该表达式为假(返回值为零), assert() 就会报错,在标准错误流(屏幕上) stderr 中写入⼀条错误信息,显示没有通过的表达式,以及包含这个表达式的文件名和行号

真如以上所示,当assert后表达式为假时候就会终止运行,并且给出报错信息提示,由此可见该程序错误行号为6

 2.无需更改代码开启或关闭 assert() 的机制

assert()对我们编写程序十十分友好的,不仅可以像以上一样把程序运行时出错的错误信息打印在屏幕上,其实还无需更改代码就可以开启或关闭assert()。

要实现这种效果这时就需要在已经确认程序没有bug时,无需assert()机制时在#include 语句的前面,定义一个宏 NDEBUG 

#define NDEBUG#includeint main(){int* p = NULL;assert(p != NULL);* p = 100;return 0;}

正如以上程序,原本assert后表达式内容为假,运行程序本应该报错,但定义一个宏 NDEBUG 之后就不会显示出报错信息提示 其实定义一个宏 NDEBUG之后 编译器就会禁用文件中所有的 assert() 语句。

如果程序又出现问题,可以移除这条 #define NDEBUG 指令(或者把它注释掉),再次编译,这样就重新启用了 assert() 语句。

在使用assrt时,程序因为引入了额外的检查,增加了程序的运行时间,所以一般我们只在调试版本中使用,而在发布版本版本中会将assert()机制关闭

而在vs中VS 这样的集成开发环境中,在 Release 版本中,直接就是优化掉了assert

2.assert使用举例

strlen的模拟实现

库函数strlen的功能是求字符串长度,统计的是字符串中 \0 之前的字符的个数

了解之后我们就可以来模拟strlen的实现

#define  _CRT_SECURE_NO_WARNINGS 1#include#includesize_t my_strlen(char const* p){int count = 0;assert(p != NULL);while (*p != '

'){count++;p++;}return count;}int main(){char arr[] = "abcdef";int sz = sizeof(arr) / sizeof(arr[0]);printf("%zd", my_strlen(arr));return 0;}

运行程序结果如下 

 

在该代码中使用到了const在*左边可以防止数组arr内容被修改 ,提升了代码的鲁棒性,同时使用assert断言可以使指针p为空时报错

上一篇:丹阳服务器怎么样?

下一篇:Java Servlet源码深度解析,揭秘Servlet工作原理实战指南