当前位置: 首页 > news >正文

郑州做网站狼牙有关网站建设文章

郑州做网站狼牙,有关网站建设文章,优书网注册,赣州有没有做网站的前言 可以把setjmp和longjmp想象成"设置检查点"和"时空穿越": setjmp就像在游戏里存档,标记一个位置 longjmp就像读取存档,直接跳回那个位置 这两个函数主要用在什么场景呢? 错误处理:在深层函…

前言

可以把setjmp和longjmp想象成"设置检查点"和"时空穿越":

  • setjmp就像在游戏里存档,标记一个位置
  • longjmp就像读取存档,直接跳回那个位置

这两个函数主要用在什么场景呢?

  • 错误处理:在深层函数中发生错误时,直接跳回到之前设置的处理点
  • 异常处理:在C语言中模拟类似try-catch的功能
  • 协程实现:保存和恢复执行状态

让我写个简单的例子来说明:

示例1:简单的异常处理

#include <stdio.h>
#include <setjmp.h>// 定义一个跳转缓冲区,用来保存"存档点"的状态
jmp_buf jump_buffer;// 模拟一个可能出错的函数
void deep_function(int value) {printf("进入 deep_function,参数值:%d\n", value);if (value < 0) {printf("哎呀,发现负数,准备跳回!\n");// 跳回到之前设置的点,并带回错误码1longjmp(jump_buffer, 1);}printf("deep_function 正常结束\n");
}int main() {printf("程序开始\n");// setjmp 返回值很特殊:// - 第一次调用时返回0// - 从longjmp跳回时返回longjmp设置的值int ret = setjmp(jump_buffer);if (ret == 0) {printf("设置跳转点\n");// 正常执行流程deep_function(-1);  // 传入一个负数printf("这行不会被执行到\n");} else {// 从longjmp跳回后的处理printf("跳回到跳转点,错误码:%d\n", ret);}printf("程序结束\n");return 0;
}

运行结果会是:

程序开始
设置跳转点
进入 deep_function,参数值:-1
哎呀,发现负数,准备跳回!
跳回到跳转点,错误码:1
程序结束

示例2:稍微复杂的异常处理

#include <stdio.h>
#include <setjmp.h>
#include <string.h>// 定义错误类型
#define ERR_FILE_NOT_FOUND 1
#define ERR_INVALID_DATA   2// 全局跳转缓冲区
jmp_buf error_jump_buffer;// 模拟抛出异常
void throw_error(int error_code) {longjmp(error_jump_buffer, error_code);
}// 模拟文件操作
void read_file(const char* filename) {printf("尝试读取文件:%s\n", filename);// 模拟文件不存在if (strcmp(filename, "not_exist.txt") == 0) {printf("文件不存在!\n");throw_error(ERR_FILE_NOT_FOUND);}// 模拟文件数据无效if (strcmp(filename, "invalid.txt") == 0) {printf("文件数据无效!\n");throw_error(ERR_INVALID_DATA);}printf("文件读取成功\n");
}// 模拟处理文件
void process_file(const char* filename) {printf("\n开始处理文件:%s\n", filename);// 设置错误处理点int error_code = setjmp(error_jump_buffer);if (error_code == 0) {// 正常执行流程read_file(filename);printf("文件处理完成\n");} else {// 错误处理switch (error_code) {case ERR_FILE_NOT_FOUND:printf("错误处理:文件未找到\n");break;case ERR_INVALID_DATA:printf("错误处理:无效数据\n");break;default:printf("错误处理:未知错误 %d\n", error_code);}}
}int main() {// 测试不同情况process_file("normal.txt");      // 正常文件process_file("not_exist.txt");   // 不存在的文件process_file("invalid.txt");     // 无效数据的文件return 0;
}

总结:

需要注意的几点:

使用限制:

  • setjmp必须在longjmp之前调用
  • longjmp不能跳转到已经返回的函数
  • 局部变量在longjmp后的值是不确定的(除非声明为volatile)

潜在风险:

  • 过度使用会使程序流程难以理解
  • 可能导致资源泄露(因为跳过了正常的清理代码)
  • 不能跨线程使用

最佳实践:

  • 主要用于错误处理
  • 尽量在较小的范围内使用
  • 确保正确处理资源清理
  • 现代C++程序应该使用异常处理机制

http://www.dtcms.com/a/494427.html

相关文章:

  • 【前端高频面试题】深入浏览器渲染原理:从输入 URL 到页面绘制的完整流程解析
  • 宿州网站建设贰聚思诚信wordpress菜单不兼容
  • C语言——深入解析C语言指针:从基础到实践从入门到精通(四)
  • Cursor 科技感的登录页面提示词
  • Ubuntu 24.04环境下的挂起转休眠
  • 【从0开始学习Java | 第21篇】网络编程综合练习
  • OpenCL初级教程
  • 【Spring AI】基于 sse 实现 MCP Server
  • vue使用限制仅允许上传 Excel 文件
  • dataease开发环境搭建
  • 一个网站开发周期wordpress导航条
  • 湖南城乡建设厅网站夜蝶直播app
  • list,咕咕咕!
  • iOS 混淆实战,多工具组合完成 IPA 混淆与加固(源码 + 成品 + 运维一体化方案)
  • Vue + Element UI 实现 el-scroll 滚动与鼠标滚轮监听全攻略
  • vue2版本的ruoyi-ui中使用vxe-table插件
  • 全国建设网站郑州seo优化公司
  • 用观察者模式通知UI刷新数据
  • 基于 AI 大模型的 UI 元素定位浏览器插件
  • Prism框架核心对象全解析
  • 阿里云服务器上部署Mosquitto
  • Android 设计模式实战手册(Kotlin 实战版)
  • Android thermal (5)_cooling device(下)
  • 活字格低代码平台实现移动端应用(安卓 /iOS)打包的技术方案与实践指南
  • SpringBoot电子商城系统
  • 解析 Qt Remote Objects:从框架原理到 Repcs 实践,以正点原子 RK3588 UI 系统为例
  • 【底层机制】【Android】Binder架构与原理
  • 揭阳市住房和城乡建设局网站网站类游戏网站开发
  • DeviceNet 转 MODBUS TCP罗克韦尔 ControlLogix PLC 与上位机在汽车零部件涂装生产线漆膜厚度精准控制的通讯配置案例
  • 【STM32项目开源】基于STM32的智能衣柜系统