setjmp和longjmp提供一种类似goto语句的机制,但它的作用域不局限于同一个函数的作用域之内。这些函数可以用于深层次的嵌套函数调用链。

int setjmp(jmp_buf state);

必须声明一个jmp_buf变量,然后使用setjmp初始化,然后储存处理器状态信息,此时初始化的返回值为0。

void longjmp(jump_buf state, int value);

将保存的状态重新恢复,longjmp使执行流通过再次从setjmp函数返回,从而跳到顶层函数中。

#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>jmp_buf restart;void func1(void);
void func2(void);int main(int argc, char **argv)
{if(setjmp(restart)){printf("program terminate \n");exit(EXIT_SUCCESS);}func1();printf("program terminate normally\n");return 0;
}void func1(void)
{printf("into func one\n");func2();printf("out  func one\n");
}void func2(void)
{printf("into func two\n");longjmp(restart, 1);printf("out  func two\n");
}

运行:

setjmp把处理器的状态信息保存到跳转缓冲区,如果变量设置为自动变量,除非没有被修改,否则,是未定义的行为。意思就是保存在内存中的变量,longjmp返回后,保持了longjmp时的值,而在cpu中的值将会退回到setjmp时的值。如下:

#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>void change(int r, int s, int a, int v);
jmp_buf state;int main()
{//r设置为寄存器变量register int r = 1;static   int s = 1;auto     int a = 1;volatile int v = 1;if(setjmp(state)){printf("r:%4d s:%4d a:%4d v:%4d\n", r, s, a, v);return 0;}r = s = a = v = 999;change(r, s, a ,v);return 1;
}void change(int r, int s, int a, int v)
{printf("r:%4d s:%4d a:%4d v:%4d\n", r, s, a, v);//r寄存器变量,跳转时r是setjmp时的值longjmp(state, 1);
}

运行:

当setjmp调用函数返回后,可能无法再次调用longjmp。

参考:https://en.wikipedia.org/wiki/Setjmp.h

转载于:https://www.cnblogs.com/yangxunwu1992/p/5875254.html

C和指针 第十六章 标准函数库 本地跳转setjmp.h相关推荐

  1. c语言标准库详解(十二):非局部跳转setjmp.h

    c语言标准库详解(十二):非局部跳转<setjmp.h> 概述 头文件<setjmp.h>中的声明提供了一种不同于通常的函数调用和返回顺序的方式,特别是,它允许立即从一个深层嵌 ...

  2. pdfstamper生成pdf无法显示汉字_正点原子STM32F4/F7水星开发板资料连载第四十六章 汉字显示实验...

    1)实验平台:正点原子水星 STM32F4/F7 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载 ...

  3. 嵌入式实时操作系统ucos-ii_「正点原子NANO STM32开发板资料连载」第三十六章 UCOSII 实验 1任务调度...

    1)实验平台:alientek NANO STM32F411 V1开发板2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第三十六章 ...

  4. 《Reids 设计与实现》第十六章 集群(下)

    <Reids 设计与实现>第十六章 集群(下) 文章目录 <Reids 设计与实现>第十六章 集群(下) 七.复制与故障转移 1.设置从节点 2.故障检测 3.故障转移 4.选 ...

  5. 【JAVA SE】第十六章 进程、线程、同步锁和线程锁的简介

    第十六章 进程.线程.同步锁和线程安全问题 文章目录 第十六章 进程.线程.同步锁和线程安全问题 一.进程 1.基本介绍 2.进程模型 二.线程 1.基本介绍 2.线程的生命周期 3.线程的优先级 4 ...

  6. abd shell关闭所有程序_第十六章 Shell编程

    第十六章 Shell编程 16.1 shell脚本运行 所谓脚本,就是把众多命令写入一个文件中,让其按照一定的逻辑顺序执行,以完成一个具体的功能.而在Linux的shell编译环境下,shell编程与 ...

  7. Windows核心编程(笔记13) 第十六章--第二十六章

    改变下记录方式,只写自己觉得需要注意一下的防止出错的地方,或者一些特别重要的点,或者一些感悟. 第十六章 线程栈 第十七章 内存映射文件 1.注意写时复制在内存映射文件中的用处. 2.#pagma d ...

  8. 【正点原子STM32连载】第四十六章 FATFS实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  9. 读书笔记:汇编语言 第三版 王爽 清华出版社 章十六 章十七 章十八

    第十六章 直接定址表16.1 描述了单位长度的标号地址标号,表征了位置的偏移地址label:数据标号,表征了一段内存空间的物理地址和长度,增强型地址标号段地址,数据标号所在段的关联段寄存器,assum ...

  10. 【正点原子MP157连载】第十六章 基本定时器实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

最新文章

  1. python-opencv 常用工具总结
  2. vs 添加ico图 到资源
  3. [转]Tomcat启动错误的几件事
  4. wxWidgets:国际化
  5. GDCM:gdcm::MediaStorage的测试程序
  6. 重磅!腾讯云首次披露自研业务上云历程
  7. 简单说说async/await
  8. JavaFX技巧29:使布局忽略不可见的节点
  9. 莱斯大学找到了多被提升3G/4G网络性能的方法
  10. Docker 配置,详细说明 daemon.json 的作用
  11. [OJ#40]后宫佳丽
  12. mybatis 多线程_2019BATJ面试题汇总详解:MyBatis+MySQL+Spring+Redis+多线程
  13. python机器人编程教程入门_机器人编程怎么入门?
  14. 基于 Spark 的文本情感分析
  15. NANK南卡发布新品旗舰版——南卡护眼台灯Pro,延续“护眼”理念
  16. 找单生狗,模拟atoi,模拟offsetof,交换奇偶位
  17. 那些年我们一起犯二的青春--文献一--注解 IGRSS-2015-2th
  18. 论文当中图片保存png、pdf等等的要分辨率DPI
  19. 树莓派最新raspbian系统换国内源
  20. 防火墙ASA5520配置

热门文章

  1. Android 应用快捷方式 ShortcutManager 简单说明
  2. android 权限管理详解,EasyPermissions源码浅析
  3. Apache Flink Meetup ·上海站精彩回顾(附PPT下载)
  4. 动图:七分钟帮你理解什么是KMP算法?
  5. vlc_for_android(基于git-3.0.0)快速集成并播放电视节目直播
  6. FFmpeg开发(一)常用处理视频命令
  7. word树状分支图_带你看懂市政管道工程图
  8. tomcat自动启动 linux,Linux设置tomcat开机自启动
  9. python无需编译解释执行,解释型语言和编译型语言的不同以及Python怎么运行
  10. 如何更改mssq,SSAS l代理运行身份验证