这个例子中,setjmp调用是做什么的?

3

3
你不理解setjmp手册页的哪个部分? - Jens Gustedt
2个回答

3

setjmp建立一个返回点,您可以使用longjmp从调用栈中深度返回到该点。通常被认为是一种不好的编程风格(类似于goto)。

第一次调用时,它将返回0。然后,如果longjmp回到跳转点,则会像setjmp返回1一样。longjmp也可以发送不同的返回代码,但如果尝试发送0,则结果将为1。

#include <setjmp.h>

jmp_buf j;

main(){
    if(setjmp(j)){
        printf("boo!\n");
        return 0;
    }
    myfunc();
    printf("5");
}

myfunc(){
    printf("1");
    myotherfunc();
}

myotherfunc(){
    printf("2");
    myfriendsfunc();
}

myfriendsfunc(){
    printf("3");
    longjmp(j, 0);
    printf("4");
}

输出:

$ ./jmp
123boo!

2

setjmp会保存上下文以便之后调用longjmp时使用。如果直接调用它(此处为jpeg_create_compress),它将返回零。当稍后调用longjmp时(必须在当前函数返回之前,但可以在任意深度的调用中),执行将直接返回到setjmp的调用点,并恢复像setjmp返回给longjmp的值一样。推测情况下,longjmp被调用时将具有非零值,因此方法将直接返回false

从上下文来看,它似乎用于错误处理。我假设在以下的compress期间可以调用longjmp。把它想象成低级异常。


我最初在一门C课程中遇到了这个问题,在那里他们建议使用信号和longjmp作为异常机制;你也可以从像SIGFPESIGINT这样的事情中恢复。然而,后来发现C标准规定,从信号处理程序中使用longjmp是未定义的行为。 - M.M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接