c语言中的assert函数_assert函数用法
大家好,又见面了,我是你们的朋友全栈君。
一、 简介
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行。
原型定义:
#include <assert.h>
void assert( int expression );
assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。请看下面的程序清单:
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
int main( void )
{
FILE *fp;
fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件
assert( fp ); //所以这里不会出错
fclose( fp );
fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败
assert( fp ); //所以这里出错
fclose( fp ); //程序永远都执行不到这里来
return 0;
}
已放弃使用assert()的原因是: 频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include <stdio.h>
#define NDEBUG
#include <assert.h>
二、 用法总结与注意事项:
1)在函数开始处检验传入参数的合法性如:
int resetBufferSize(int nNewSize)
{
//功能:改变缓冲区大小,
//参数:nNewSize 缓冲区新长度
//返回值:缓冲区当前长度
//说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区
assert(nNewSize >= 0);
assert(nNewSize <= MAX_BUFFER_SIZE);
...
}
2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败,如:
不好:
assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
好:
assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);
3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题,如:
错误:
assert(i++ < 100); 这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。
正确:
assert(i < 100); i++; 4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感。
5)有的地方,assert不能代替条件过滤。
assert是用来避免显而易见的错误的,而不是处理异常的。错误和异常是不一样的,错误是不应该出现的,异常是不可避免的。c语言异常可以通过条件判断来处理,其它语言有各自的异常处理机制。
一个非常简单的使用assert的规律就是,在方法或者函数的最开始使用,如果在方法的中间使用则需要慎重考虑是否是应该的。方法的最开始还没开始一个功能过程,在一个功能过程执行中出现的问题几乎都是异常。
如果ASSERT()中的条件不成立(比如 ASSERT(0) ; ),会弹出一个比较吓人的对话框。 点击重试,可以到达 ASSERT 断言不成立的那一行, 此时可以在watch窗口查看变量值,找出出错的原因。 如果程序能够继续运行,可以按F5继续调试。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170924.html原文链接:https://javaforall.cn
相关文章
- pycharm单行和多行注释快捷键_c语言基本函数及解释
- c语言delay函数的作用,delay用法(delay函数使用)「建议收藏」
- Go语言结构体之属性及函数(十八)
- 【R语言】rep函数的使用
- c语言scanf函数用法详解_c语言输入scanf格式
- 【说站】c语言中函数的声明和定义
- 2.Go语言编程学习课后实践
- c语言字符串转换为整型_c语言输出负数用什么
- C语言strstr函数_c语言fwrite函数的用法
- fprintf函数的作用_c语言fopen函数的用法
- Go语言中常见100问题-#3 Misusing init functions
- 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(6)- 语义分析:符号表和变量、函数
- Go语言 WaitGroup 源码知多少
- 跟小洁老师学习R语言的第四天
- 【愚公系列】2023年02月 WMS智能仓储系统-002.多语言功能实现
- 【C++ 语言】面向对象 ( 模板编程 | 函数模板 | 类模板 )
- 【C 语言】文件操作 (fscanf、fprintf 函数)
- 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 通过 交换指针指向的内存数据 方式进行排序 )
- Go语言函数类型
- Go语言哈希函数