**与刺激的abort()和exit()相比,goto语句看起来是处理异常的更可行方案。不幸的是,goto是本地的: 它只能跳到所在函数内部的标号上,而不能将控制权转移到所在程序的任意地点(当然,除非你的所有代码都在main体中)。为了解决这个限制,C函数库提供了setjmp()和longjmp()函数,它们分别承担非局部标号和goto作用。头文件setjmp.h申明了这些函数及同时所需的jmp_buf数据类型。

原理非常简单:
1.setjmp(j)设置“jump”点,用正确的程序上下文填充jmp_buf对象j。这个上下文包括程序存放位置、栈和框架指针,其它重要的寄存器和内存数据。当初始化完jump的上下文,setjmp()返回0值。
2. 以后调用longjmp(j,r)的效果就是一个非局部的goto或“长跳转”到由j描述的上下文处(也就是到那原来设置j的setjmp()处)。当作为长跳转的目标而被调用时,setjmp()返回r或1(如果r设为0的话)。(记住,setjmp()不能在这种情况时返回0。)
通过有两类返回值,setjmp()让你知道它正在被怎么使用。当设置j时,setjmp()如你期望地执行;但当作为长跳转的目标时,setjmp()就从外面“唤醒”它的上下文。你可以用longjmp()来终止异常,用setjmp()标记相应的异常处理程序。**

#include <setjmp.h>
#include <stdio.h>
jmp_buf j;
void raise_exception(void)
{printf("exception raised\n");longjmp(j, 3); /* jump to exception handler case 3 */printf("this line should never appear\n");
}
int main(void)
{switch (setjmp(j)){case 0:printf("''setjmp'' is initializing ''j''\n");raise_exception();printf("this line should never appear\n");case 1:printf("Case 1\n");break;case 2:printf("Case 2\n");break;case 3:printf("Case 3\n");break;default:break;}return 0;
}

函数的输出

/home/andrew/文档/IMPORTENT_C/cmake-build-debug/IMPORTENT_C
''setjmp'' is initializing ''j''
exception raised
Case 3Process finished with exit code 0

高级C语言教程-C语言函数setjmp()函数相关推荐

  1. c语言return 11,二级C语言教程章节测试11.对函数的进一步讨论

    一.选择题 (1)有以下程序 # include void f(char *s, char *t) { char k; k=*s; *s=*t; *t=k; s++; t--; if (*s) f(s ...

  2. 在线 Go 语言教程 —— Go 语言之旅(gotour)

    ​ 初识gotour Go 语言之旅,支持在线敲代码练习的官方入门教程 Go 语言性能很高,非常适于后端网络.分布式编程,因此受到各大互联网公司的青睐. 那么如何学习 Go 语言呢? 其实官方已经为我 ...

  3. C语言教程(七):函数

    参考: <标准C语言基础教程>(第四版)[美] Gary J.Bronson 著 张永健 等译 r0nny的博客:https://blog.csdn.net/qq_42471423/art ...

  4. python语言教程-Python语言教程手册

    Python语言教程手册 Python是什么? 解释性语言 多范式 介绍 命令后>>>python Python 2.7.3 (default, Aug 1 2012, 05:14: ...

  5. mysql c语言教程,C语言调用mysql快速教程(精华篇).pdf

    C语言调用mysql快速教程(精华篇).pdf ,使用 语言操作 之前,先在 里头创建一个数据库,一个表,在表里头添加 1 c mysql mysql 数据如下: 创建数据库,库名为 cusemysq ...

  6. 觅凤c语言教程,C语言程序设计教程 第1章.ppt

    傣永靶莱瑞市芽星谴绥真椎匣灵租骡淬女测推谅应弥蠢仑早饲姑锗佩草隔C语言程序设计教程 第1章C语言程序设计教程 第1章 第1章 绪 论 ? ? 唆闽邹搔绕裂陶短噎诚贤希绞重垒嚷济酸凛委句枉鞘扁渗皋耿淮此 ...

  7. w3c易语言教程,易语言基础教程之简单的人机交互

    易语言由于完全支持面向对象编程理念,因此也秉性了功能与外观相分离的良好编程思路.了解并掌握易语言中的人机交互操作,对于理解易语言编程思维及至掌握易语言编程核心,都具有极为重要的意义. 这节教程我们要实 ...

  8. 双语的c语言教程,C语言程序设计课程双语教学探索与实践

    摘要:针对我国高校中双语教学的现状,阐述在C语言程序设计课程中开展双语教学的可能性和可行性,分析教学过程中的关键环节,从开展条件.教学组织.效果评价等方面进行探讨,并对双语教学实践中遇到的问题进行分析 ...

  9. turbo c语言教程,C语言基础教程(六)Turbo C 程序设计初步(1)

    本节主要介绍Turbo C程序设计的基本步骤及如何编译.调试和运行源程序. 并给出Turbo C的常用编辑命令.最后介绍Turbo C编译.连接和运行时的常见错 误. 一.Turbo C程序设计基本步 ...

最新文章

  1. POJ 2942 Knights of the Round Table (算竞进阶习题)
  2. 监控录像帮忙找回医院被偷的女婴
  3. iOS 高效的分页加载
  4. python中全局变量和局部变量详解_Python全局变量与局部变量详解
  5. 360急速浏览器JS的调试
  6. 9家专利拥有者退出MPEG LA HEVC 华为加入HEVC Advance
  7. 学习ASP.NET Core,你必须知道“中间件”是什么?中间件如何注册?请求处理管道是如何通过中间件构建的?
  8. mysql基础知识整理_MYSQL基础知识整理
  9. java createstatement,createStatement参数说明
  10. JAVA控制台扑克牌游戏,洗牌,发牌,比较大小
  11. JetS3t使用说明
  12. 接口测试简单介绍、及jmeter的简单使用
  13. 如何让Low Poly好看
  14. lodop 条码类型说明
  15. python识图自动化_基于python+appium通过图片对比来做的UI自动化
  16. 【20200207】【lyk】TJOI2019 唱、跳、rap、篮球题解
  17. ks 曲线_关于模型检验的ROC值和KS值的异同_ROC曲线和KS值
  18. 关于小程序移动端调用微信API及腾讯地图实例,获取当前位置、逆地址解析、路线规划、地图展示
  19. 检测PE文件的有效性
  20. 有能力的人从不抱怨大环境!

热门文章

  1. [转]互联网产品经理必上的九个资讯+分析类网站
  2. 批量消除图片的杂色背景
  3. [导入]ASP.NET26个常用性能优化方法
  4. 将web项目导入到eclipse/MyEclipse中常见错误
  5. NYOJ 640 Geometric Sum
  6. ubuntu安装USB转串口驱动(PL2303)
  7. ssy-publish
  8. js判断是微信、QQ内置浏览器打开页面
  9. 马尔科夫网络和一阶马尔科夫链
  10. Java POI 导出EXCEL经典实现 Java导出Excel