在这个例子中,setjmp调用做了什么

时间:2014-04-01 07:07:14

标签: c

我想在以下代码中理解 setjmp

http://androidxref.com/4.2.2_r1/xref/frameworks/base/core/jni/android/graphics/YuvToJpegEncoder.cpp#24

这行setjpg()是什么意思?

32   if (setjmp(sk_err.fJmpBuf)) {
33        return false;
34    }

2 个答案:

答案 0 :(得分: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!

答案 1 :(得分:2)

setjmp保存上下文,以便日后调用longjmp。它在直接调用时返回零(因此,执行继续执行jpeg_create_compress)。稍后调用longjmp时(它必须在当前函数返回之前,但它可以处于任意调用深度),执行将直接返回setjmp调用,并恢复为{{1}返回你给setjmp的任何内容。据推测,在这种情况下,将使用非零值调用longjmp,因此该方法将直接返回longjmp

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