首页 > 其他分享 >笔记整理--C语言--assert用法总结——转载

笔记整理--C语言--assert用法总结——转载

时间:2023-08-17 16:45:19浏览次数:34  
标签:fp -- C语言 assert nOffset int include

assert用法总结

assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:

#include <assert.h>
void assert( int expression );

assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。

请看下面的程序清单badptr.c:

#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;
}

[root@localhost error_process]# gcc badptr.c
[root@localhost error_process]# ./a.out
a.out: badptr.c:14: main: Assertion `fp' failed.
已放弃

使用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);

...
}
  1. 每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败

不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);

好: assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);

  1. 不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题
    错误: assert(i++ < 100)
    这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。

正确: assert(i < 100)
i++;

  1. assert和后面的语句应空一行,以形成逻辑和视觉上的一致感

  2. 有的地方,assert不能代替条件过滤

标签:fp,--,C语言,assert,nOffset,int,include
From: https://www.cnblogs.com/stlong/p/17637557.html

相关文章

  • RabbitMQ入门
    1简介​ RabbitMQ是采用erlang语言实现AMQP(AdvancedMessageQueuingProtocol,高级消息队列协议)的消息中间件,它最初起源于金融系统,用于在分布式系统中存储转发消息。​ RabbitMQ是目前非常热门的一款消息中间件,不管是互联网行业还是传统行业都在大量地使用RabbitMQ......
  • JAVA权限管理 助力企业精细化运营
    在企业的日常经营中,企业人数达到一定数量之后,就需要对企业的层级和部门进行细分,建立企业的树形组织架构。围绕着树形组织架构,企业能够将权限落实到个人,避免企业内部出现管理混乱等情况。权限管理是每个企业管理中的重要内容,但在实操中,权限管理面临着诸多考验。因为,权限管理本身不......
  • PageOffice5.x升级到6.x的关键步骤
    转载:PageOffice5.x升级到6.x的关键步骤5.x升级到6.x的关键步骤Vue+Springboot前后端分离项目将后端Springboot项目中pom.xml文件中对于pageoffice的jar引用升级成6.0版本,以maven中央仓库(https://mvnrepository.com/artifact/com.zhuozhengsoft/pageoffice)最新版本为准,比......
  • redis:info指令
    学习自:Redis之info指令_redis-cliinfo_多动手,勤思考的博客-CSDN博客官网:INFO|Redis场景redis提供了info指令,可以帮助用户查询redis服务运行期间内部的参数以及实时信息,根据这些信息可以帮助用户诊断问题或查看服务负载、内存压力等信息。info指令显示的信息繁多,分为9大块,......
  • Python实现自定义请求头消息headers
    使用python爬虫爬取数据的时候,经常会遇到一些网站的反爬虫措施,一般就是针对于headers中的User-Agent,如果没有对headers进行设置,User-Agent会声明自己是python脚本,而如果网站有反爬虫的想法的话,必然会拒绝这样的连接。而修改headers可以将自己的爬虫脚本伪装成浏览器的正常访问,来......
  • 生物医学工程 生物信息学
    重点交叉学科学科简介招收专业生物医学工程生物医学工程旨在以技术与工程的手段,研究和解决生物学和医学中的有关问题,是综合生物学、医学和工程技术学的交叉学科,属于高新科技研究领域。欢迎化学、生物学、医学、计算机科学、电子学、物理学、力学等学科专业的......
  • 常见的Web安全漏洞有哪些,Web安全漏洞常用测试方法介绍
    Web安全漏洞是指在Web应用程序中存在的可能被攻击者利用的漏洞,正确认识和了解这些漏洞对于Web应用程序的开发和测试至关重要。一、常见的Web安全漏洞类型:1、跨站脚本攻击(Cross-SiteScripting,XSS):攻击者通过向Web页面注入恶意脚本来执行恶意操作,例如窃取用户敏感信息......
  • PMP考试有哪些细节不可忽视?小白都要知道!
    PMP®考试是对整个学习备考效果的检验,直接关系到考生能否顺利拿到证书。但很多同学是第一次参加PMP®考试,对于考试中的一些细节和注意事项并不是很了解,为了帮助各位同学有更好的临场发挥,顺利拿到证书,才聚专门整理了PMP®考试中的一些重要细节和需要注意的事项,希望能对大家有所帮助......
  • Lnton羚通关于安装 Visual Studio 2022 Community 卡住了&& 安装 Windows SDK(Softwar
    【问题原因】a.系统升级了;b.之前卸载没卸载干净,注册表里存在旧的信息;【解决过程】1.查看日志在资源管理器中输入%TEMP%\windowssdk,查看日志文件,找到最新的日志文件,在文件中搜索Warning出现了一组长串数字,用 {} 括起来的一串,这串数字后面要用;2.微软官方工具微软官方的工具(Micr......
  • 【航迹】基于MN逻辑算法实现航迹关联和卡尔曼滤波外推附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......