setjmp()和longjmp()--c的非本地跳转

6 篇文章 0 订阅

函数原型

//函数原型
#include 
   
   
    
    
int setjmp(jmp_buf env);
int longjmp(jmp_buf env,int retval);

   
   

setjmp 函数在evn 缓冲区中保存当前调用环境,供后面的longjmp 使用。evn 中保存了程序计数器,栈指针和寄存器中的内容。

longjmp 函数从evn 中恢复调用环境,触发最近一次初始化env 的setjmp 的返回,setjmp 返回并带有返回值retval。

setjmp 函数只被调用一次,但是返回多次:第一次调用setjmp 初始化保存调用环境的缓冲区env,并返回0;被相应的longjmp调用

触发,并返回retval。

示例:

#include "stdio.h"
#include "stdlib.h"
#include "setjmp.h"
#include "signal.h"

jmp_buf buf;

int error1 = 0;
int error2 = 1;

void foo(void),bar(void);

int main()
{
   int rc;
   
   rc = setjmp(buf);
   if (rc == 0)
       foo();
   else if (rc == 1)
       printf("Detected an error1 condition in foo\n");
   else if (rc == 2)
       printf("Detected an error2 condition in foo\n");
   else 
       printf("Unknown error condition in foo\n");
   exit(0);
}

void foo(void)
{
   if (error1)
       longjmp(buf, 1);
   bar();
}

void bar(void)
{
   if (error2)
       longjmp(buf, 2);
}
main 函数首先调用setjmp 以保存当前的调用环境,然后调用foo,foo再调用bar。如果foo 或bar 遇到一个错误,它们立刻通过一次longjmp 调用
从setjmp 返回。setjmp的非零返回值指明了错误类型,随后可以被解码,并且在代码的某个位置进行处理。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值