iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >浅析C语言中的setjmp与longjmp函数
  • 443
分享到

浅析C语言中的setjmp与longjmp函数

setjmplongjmp 2022-11-15 22:11:14 443人浏览 安东尼
摘要

setjmp和longjmp是C语言独有的,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,按照程序员的预先设计的意图,去实现对程序中可能出现的异常进行集中处理。 先来看一

setjmp和longjmp是C语言独有的,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,按照程序员的预先设计的意图,去实现对程序中可能出现的异常进行集中处理。

先来看一下这两个函数的定义吧:

setjmp和longjmp的函数原型在setjmp.h中

函数原型:
int setjmp(jmp_buf envbuf);

setjmp函数用缓冲区envbuf保存系统堆栈的内容,以便后续的longjmp函数使用。setjmp函数初次启用时返回0值。

void longjmp(jmp_buf envbuf, int val);

longjmp函数中的参数envbuf是由setjmp函数所保存的堆栈环境,参数val设置setjmp函数的返回值。longjmp函数本身是没有返回值的,它执行后跳转到保存envbuf参数的setjmp函数调用,并由setjmp函数调用返回,此时setjmp函数的返回值就是val。

上面的说明有点拗口,通俗的解释是:先调用setjmp,用变量envbuf记录当前的位置,然后调用longjmp,返回envbuf所记录的位置,并使setjmp的返回值为val。当时用longjmp时,envbuf的内容被销毁了。其实这里的“位置”一词真正的含义是栈定指针。

接着让我们看一个小例子吧:


#include <stdio.h>
#include <setjmp.h>

jmp_buf buf;

banana(){
    printf("in banana() \n");
    longjmp(buf,1);

    printf("you'll never see this,because i longjmp'd");

}

main()
{
    if(setjmp(buf))
        printf("back in main\n");
    else{
        printf("first time through\n");
        banana();
    }

}


这段代码的打印结果是:
first time through
in banana()
back in main

仔细看一下应该更能体会这对函数的作用了吧。

setjmp/longjmp的最大用处是错误恢复,类似try ...catch...

他们的功能比Goto强多了,goto只能在函数体内跳来跳去,而setjmp/longjmp可以在到过的所有位置间。

--结束END--

本文标题: 浅析C语言中的setjmp与longjmp函数

本文链接: https://www.lsjlt.com/news/172434.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅析C语言中的setjmp与longjmp函数
    setjmp和longjmp是C语言独有的,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,按照程序员的预先设计的意图,去实现对程序中可能出现的异常进行集中处理。 先来看一...
    99+
    2022-11-15
    setjmp longjmp
  • C语言浅析函数的用法
    目录问题引入函数C语言中函数的语法形式问题例子函数的调用过程函数声明变量声明数组声明问题引入 有时候,我们经常需要在一个程序中,对一个数组进行 键盘输入,打印数组元素值。 有些代码块...
    99+
    2022-11-13
  • Go语言中init函数与匿名函数使用浅析
    目录init函数基本介绍注意事项和细节案例匿名函数介绍调用方式方式1方式2init函数 基本介绍 每一个源文件都可以包含一个init函数,该函数会在main函数执行前,被Go运行框架...
    99+
    2023-01-16
    Go init函数与匿名函数 Go init函数 Go匿名函数
  • C语言深入浅出分析函数指针
    我们先看一个代码: #include<stdio.h> void test() { printf("haha\n"); } int main() { printf("...
    99+
    2022-11-13
  • C语言中数组排序浅析
    目录前言一、插入排序1、思路2、具体步骤3、代码实现4、复杂度二、冒泡排序1、思路2、具体步骤3、代码实现4、复杂度三、选择排序1、思路2、具体步骤3、代码实现4、复杂度四、希尔排序...
    99+
    2022-12-14
    C语言数组排序 C语言数组 C语言排序
  • 深入浅析C语言与C++的区别与联系
    目录一、C语言是面向过程语言,而C++是面向对象语言1、面向过程和面向对象的区别2、面向过程和面向对象的优缺点面向过程语言面向对象语言二、具体语言上的区别1、关键字的不同2、后缀名不...
    99+
    2022-11-12
  • 浅析C语言中assert的用法
    assert是C语言中的一个宏,用于在程序中检查特定的条件是否为真。当assert条件为假时,程序会中止执行,并打印出错误消息。as...
    99+
    2023-08-11
    C语言
  • C语言深入分析函数与宏的使用
    目录一、函数与宏二、宏的妙用三、小结一、函数与宏 宏是由预处理器直接替换展开的,编译器不知道宏的存在函数是由编译器直接编译的实体,调用行为由编译器决定多次使用宏会导致最终可执行程序的...
    99+
    2022-11-13
  • c语言和c++语言中const修饰的变量区别浅析
    目录c:修饰全局变量:修饰局部变量:c++:修饰全局变量:修饰局部变量:总结:在c语言中:在c++语言中:总结c: 修饰全局变量: 用const修饰的全局变量是没有办法直接修改的,间...
    99+
    2022-11-13
  • C语言中库函数的示例分析
    这篇文章主要为大家展示了“C语言中库函数的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言中库函数的示例分析”这篇文章吧。1 返回整数的getchar函数代码:#include<...
    99+
    2023-06-29
  • C语言中main函数与命令行参数实例分析
    这篇文章主要介绍了C语言中main函数与命令行参数实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言中main函数与命令行参数实例分析文章都会有所收获,下面我们一起来看看吧。一、main 函数的概念C...
    99+
    2023-06-30
  • C语言中scanf与scnaf_s函数详解
    目录scanf_s使用scanf_sscanf使用scanf总结scanf_s scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc...
    99+
    2022-11-12
  • 浅析C++中的间接宏函数
    宏函数对于每个C++程序员都决不陌生,就算是初出茅庐的C++程序员也知道如何定义、使用宏函数。 但是当初学者看到类似于以下这种宏函数嵌套的时候,可能还是会比较嘀咕, #defi...
    99+
    2022-11-12
  • R语言中c()函数与paste()函数的区别说明
    c()函数:将括号中的元素连接起来,并不创建向量 paste()函数:连接括号中的元素 例如 c(1, 2:4),结果为1 2 3 4 paste(1, 2:4),结果为“1 2” ...
    99+
    2022-11-12
  • Kotlin语言中CompileSdkVersion与targetSdkVersion的区别浅析
    目录前言一.CompileSdkVersion与targetSdkVersion是什么1.1 compileSdkVersion1.2 targetSdkVersion二.compi...
    99+
    2023-02-23
    Kotlin CompileSdkVersion与targetSdkVersion的区别 Kotlin CompileSdkVersion
  • C语言的div()函数实例分析
    本文小编为大家详细介绍“C语言的div()函数实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言的div()函数实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。...
    99+
    2022-10-19
  • C语言中函数递归的示例分析
    这篇文章主要介绍C语言中函数递归的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是递归?递归(recursion):程序调用自身的一种编程技巧。如何理解函数递归:从调用自身层面:函数递归就是函数自己调用自...
    99+
    2023-06-29
  • 详解C语言中strcpy函数与memcpy函数的区别与实现
    目录字符串拷贝函数(strcpy)函数原型应用实例缺点内存拷贝函数(memcpy)函数原型应用实例memcpy的模拟实现(my_memcpy)实现样例具体实现字符串拷贝函数(strc...
    99+
    2022-12-29
    C语言 strcpy memcpy区别 C语言 strcpy memcpy实现 C语言 strcpy memcpy
  • C语言模拟内存函数分析之mencpy与memmove
    目录前言模拟实现简单的内存函数1.memcpy-内存拷贝函数(应该拷贝不重叠的内存)2.memmove-内存拷贝函数(可以拷贝重叠的内存)总结前言 内存是CPU与外存进行沟通的桥梁。...
    99+
    2022-11-13
  • C语言中的内联函数(inline)与宏定义(#define)详细解析
    先简明扼要,说下关键:1、内联函数在可读性方面与函数是相同的,而在编译时是将函数直接嵌入调用程序的主体,省去了调用/返回指令,这样在运行时速度更快。2、内联函数可以调试,而宏定义是不...
    99+
    2022-11-15
    内联函数 宏定义
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作