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

概述

头文件<setjmp.h>中的声明提供了一种不同于通常的函数调用和返回顺序的方式,特别是,它允许立即从一个深层嵌套的函数调用中返回。
<setjmp.h>定义了一宏setjmp()、一函数longjmp()、一变量jmp_buf

setjmp()宏

int setjmp(jum_buf env)

setjmp宏将状态信息保存到env中,供longjmp使用。如果直接调用setjmp,则返回值为0;如果是在 longjmp 中调用 setjmp,则返回值为非 0。setjmp 只能用于某些上下文中,如用于 if 语句、switch 语句、循环语句的条件测试中以及一些简单的关系表达式中。 例如:

if (setjmp(env) == 0)/* get here on direct call */
else/* get here by calling longjmp */

longjmp()函数

void longjmp(jmp_buf env, int val)

longjmp 通过最近一次调用 setjmp 时保存到 env 中的信息恢复状态,同时,程序重新恢复执行,其状态等同于 setjmp 宏调用刚刚执行完并返回非 0 值 val。包含 setjmp 宏调用的函数的执行必须还没有终止。除下列情况外,可访问对象的值同调用 longjmp 时的值相同:在调用 setjmp 宏后,如果调用 setjmp 宏的函数中的非 volatile 自动变量改变了,则它们将变成未定义状态。

示例

setjmp()宏

代码:

#include <stdio.h>
#include <setjmp.h>
static jmp_buf buf;
void second(void) {printf("second\n");         // 打印longjmp(buf,1);             // 跳回setjmp的调用处 - 使得setjmp返回值为1
}
void first(void) {second();printf("first\n");          // 不可能执行到此行
}
int main() {   if ( ! setjmp(buf) ) {first();                // 进入此行前,setjmp返回0} else {                    // 当longjmp跳转回,setjmp返回1,因此进入此行printf("main\n");       // 打印}return 0;
}

输出:

PS G:\CSAPP>  & 'c:\Users\swy\.vscode\extensions\ms-vscode.cpptools-0.27.1\debugAdapters\bin\WindowsDebugLauncher.exe' '--stdin=Microsoft-MIEngine-In-1mtiwdp1.m0g' '--stdout=Microsoft-MIEngine-Out-ueyj5xdd.dcx' '--stderr=Microsoft-MIEngine-Error-jzi12hfa.eww' '--pid=Microsoft-MIEngine-Pid-n2w24u5e.db5' '--dbgExe=G:\x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw64\bin\gdb.exe' '--interpreter=mi'
second
main
PS G:\CSAPP> 

longjmp()函数

代码:

#include <stdio.h>
#include <setjmp.h>
static jmp_buf buf;
void second(void) {printf("second\n");         // 打印longjmp(buf,1);             // 跳回setjmp的调用处 - 使得setjmp返回值为1
}
void first(void) {second();printf("first\n");          // 不可能执行到此行
}
int main() {   if ( ! setjmp(buf) ) {first();                // 进入此行前,setjmp返回0} else {                    // 当longjmp跳转回,setjmp返回1,因此进入此行printf("main\n");       // 打印}return 0;
}

输出:

PS G:\CSAPP>  & 'c:\Users\swy\.vscode\extensions\ms-vscode.cpptools-0.27.1\debugAdapters\bin\WindowsDebugLauncher.exe' '--stdin=Microsoft-MIEngine-In-zxmrs0e0.khk' '--stdout=Microsoft-MIEngine-Out-2tgkgf02.swc' '--stderr=Microsoft-MIEngine-Error-rwlffa0w.qgh' '--pid=Microsoft-MIEngine-Pid-tlulidov.ygu' '--dbgExe=G:\x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw64\bin\gdb.exe' '--interpreter=mi'
second
main
PS G:\CSAPP> 

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

  1. c语言标准库详解(七):字符串函数string.h

    c语言标准库详解(七):字符串函数<string.h> 头文件<string.h>中定义了两组字符串函数.第一组函数的名字以 str 开头:第二组函数的名字以 mem 开头.除 ...

  2. c语言标准库详解(十五):limits.h与float.h

    c语言标准库详解(十五):<limits.h>与<float.h> 概述 <limits.h> 头文件<limits.h>定义了一些表示整型大小的常量. ...

  3. c语言标准库详解(十四):时间函数time.h

    c语言标准库详解(十四):时间函数<time.h> 概述 头文件<time.h>中声明了一些处理日期与时间的类型和函数.其中的一些函数用于处理当地时间,因为时区等原因,当地时间 ...

  4. c语言标准库详解(八):数学公式math.h

    c语言标准库详解(八):数学公式<math.h> 概述 头文件<math.h>中声明了一些数学函数和宏. 宏 EDOM 和 ERANGE(在头文件<error.h> ...

  5. MATLAB Simulink模块库详解(二)Sinks篇

    MATLAB Simulink模块库详解(二)Sinks篇 Simulink模块库概述 1.Sources模块库,为仿真提供各种信号源 2.Sinks模块库,为仿真提供输出设备元件 3.Continu ...

  6. c语言标准库详解(十一):可变参数表stdarg.h

    c语言标准库详解(十一):可变参数表<stdarg.h> 概述 头文件<stdarg.h>提供了遍历未知数目的函数参数表的功能. 假定函数 f 带有可变数目的实际参数,last ...

  7. Linux内核Thermal框架详解十二、Thermal Governor(2)

    本文部分内容参考 万字长文 | Thermal框架源码剖析, Linux Thermal机制源码分析之框架概述_不捡风筝的玖伍贰柒的博客-CSDN博客, "热散由心静,凉生为室空" ...

  8. c语言标准库详解(零):总述

    c语言标准库详解(零):总述 关于标准库 标准库不是C语言本身的构成部分,但是支持标准C的实现会提供函数库中的函数声明.类型以及宏定义 标准库的内容 标准库中的函数.类型以及宏分别在下面的标准头文件中 ...

  9. matlab中sinks,MATLAB Simulink模块库详解(二)Sinks篇

    MATLAB Simulink模块库详解(二)Sinks篇 Simulink模块库概述 1.Sources模块库,为仿真提供各种信号源 2.Sinks模块库,为仿真提供输出设备元件 3.Continu ...

最新文章

  1. Getting Started with OpenCV
  2. python中的reduce、lambda函数
  3. 用openoffice+jodconverter+webuploader+pdf.js实现文件上传、在线预览功能
  4. android文件存储token,ANDROID 学习笔记(二) 用户登陆问题 TOKEN SESSION 缓存
  5. Concept3D推出交互式3D地图平台
  6. mysql8.0.11启动不了_8.0.11版本Mysql遇到MySQL 服务无法启动的解决方法
  7. Linux IPC实践(5) --System V消息队列(2)
  8. 如何选择使用结构或类
  9. ssh不能进入save方法_快速理清为什么你的redis未授权不能getshell
  10. java中四种修饰符
  11. 2005年财富500强(zz)
  12. PCD Lesson3:PCD文件的读取
  13. 推荐一款好用的加密软件 filepackage 文件加密 U盘加密 移动硬盘加密
  14. 【数学建模】预测模型之BP网络预测
  15. phpstudy和php,phpstudy和wamp哪个好
  16. PIE Engine机器学习遥感影像监督分类全流程(附源码)
  17. 复数Complex类
  18. 计算机硬盘损坏 数据如何修复,如何修复计算机硬盘错误?如何从硬盘数据损坏中恢复数据?...
  19. 旅行青蛙——手游破解究竟需要多少成本
  20. python怎么判断等于_python中怎么判断不等于

热门文章

  1. fileupload实现多文件批量上传
  2. 位图(BitMap)
  3. 在线html5视频播放器,分享10款最棒的免费HTML5视频播放器
  4. 大数据——CentOS 7加装虚拟机存储空间、CPU和内存
  5. 基于51单片机的WIFI模块的简单通信
  6. matlab解坐标方程,用MATLAB求解亥姆霍兹方程的方法
  7. 使用IP切换器的优点和缺点是什么?
  8. 人工智能时代的工作、学习和生活---《人工智能》阅读笔记
  9. license生成工具
  10. 高德地图点击按钮,控制高德地图上的热力图显示与隐藏