我想在以下代码中理解 setjmp :
这行setjpg()是什么意思?
32 if (setjmp(sk_err.fJmpBuf)) {
33 return false;
34 }
答案 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
。可以把它想象成低级异常。