assert()函数用法总结(推荐)

发布时间 - 2026-01-10 22:48:11    点击率:

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);
  ...
}

  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()函数用法总结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# assert函数的用法  # assert函数  # JavaScript中的console.assert()函数介绍  # python中assert用法实例分析  # 浅析C语言中assert的用法  # 这条  # 不存在  # 小编  # 多个  # 在此  # 可以通过  # 给大家  # 只在  # 这么做  # 永远都  # 这是因为  # 如在  # 即为  # 所述  # 创建一个  # 给我留言  # 值为  # 感谢大家  # 先向  # 返回值 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  详解vue.js组件化开发实践  如何为不同团队 ID 动态生成多个“认领值班”按钮  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  如何选择可靠的免备案建站服务器?  如何实现建站之星域名转发设置?  怎么用AI帮你设计一套个性化的手机App图标?  浅谈javascript alert和confirm的美化  如何正确选择百度移动适配建站域名?  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Laravel中的withCount方法怎么高效统计关联模型数量  高端网站建设与定制开发一站式解决方案 中企动力  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Mybatis 中的insertOrUpdate操作  Laravel如何与Inertia.js和Vue/React构建现代单页应用  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  如何在 Pandas 中基于一列条件计算另一列的分组均值  5种Android数据存储方式汇总  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  如何快速生成橙子建站落地页链接?  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  如何用5美元大硬盘VPS安全高效搭建个人网站?  微信小程序 五星评分(包括半颗星评分)实例代码  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  Laravel distinct去重查询_Laravel Eloquent去重方法  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  EditPlus中的正则表达式实战(6)  微信小程序 HTTPS报错整理常见问题及解决方案  如何快速上传建站程序避免常见错误?  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  如何在VPS电脑上快速搭建网站?  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  动图在线制作网站有哪些,滑动动图图集怎么做?  Android中AutoCompleteTextView自动提示  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  Laravel如何配置和使用缓存?(Redis代码示例)  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  西安专业网站制作公司有哪些,陕西省建行官方网站?  如何在阿里云虚拟主机上快速搭建个人网站?  如何快速上传自定义模板至建站之星?  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复