setjmp 和 longjmp 函数使用详解

本文介绍了C语言中的非局部跳转语句setjmp和longjmp的功能及使用方法。通过示例程序展示了如何利用这两个函数实现跨函数的错误处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

非局部跳转语句—setjmp和longjmp函数。非局部指的是,这不是由普通C语言goto,语句在一个函数内实施的跳转,而是在栈上跳过若干调用帧,返回到当前函数调用路径上的某一个函数中。

#include <setjmp.h>
int setjmp(jmp_buf  env);

返回值:若直接调用则返回0,若从longjmp调用返回则返回非0值的longjmp中的val值

void longjmp(jmp_buf env,int val);

调用此函数则返回到语句setjmp所在的地方,其中env 就是setjmp中的 env,而val 则是使setjmp的返回值变为val。
当检查到一个错误时,则以两个参数调用longjmp函数,第一个就是在调用setjmp时所用的env,第二个参数是具有非0值的val,它将成为从setjmp处返回的值。使用第二个参数的原因是对于一个setjmp可以有多个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;  
}

上述程序将输出:

second
main
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值