Error handling
假设嵌套在许多其他函数中的函数内部存在错误,并且错误处理只有在顶级函数中才有意义.
如果中间的所有函数都必须正常返回,并计算返回值或全局错误变量,以确定进一步的处理没有意义,甚至不好,这将是非常繁琐和尴尬的.
在这种情况下,setjmp/longjmp是有意义的.
Coroutines
除了错误处理之外,我还能想到在C中需要setjmp/long jmp的另一种情况:
当你需要实现coroutines的时候就是这样.
这里有一个小的演示示例. 我希望它能满足Sivolrasad Palas对一些示例代码的请求,并回答TheBlastOne的问题setjmp/long jmp如何支持corroutines的实现(就我所见,它并不基于任何非标准或新的行为).
EDIT:
#include <stdio.h>
#include <setjmp.h>
jmp_buf bufferA, bufferB;
void routineB(); // forward declaration
void routineA()
{
int r ;
printf("(A1)\n");
r = setjmp(bufferA);
if (r == 0) routineB();
printf("(A2) r=%d\n",r);
r = setjmp(bufferA);
if (r == 0) longjmp(bufferB, 20001);
printf("(A3) r=%d\n",r);
r = setjmp(bufferA);
if (r == 0) longjmp(bufferB, 20002);
printf("(A4) r=%d\n",r);
}
void routineB()
{
int r;
printf("(B1)\n");
r = setjmp(bufferB);
if (r == 0) longjmp(bufferA, 10001);
printf("(B2) r=%d\n", r);
r = setjmp(bufferB);
if (r == 0) longjmp(bufferA, 10002);
printf("(B3) r=%d\n", r);
r = setjmp(bufferB);
if (r == 0) longjmp(bufferA, 10003);
}
int main(int argc, char **argv)
{
routineA();
return 0;
}
Following figure shows the flow of execution:
Warning note
使用setjmp/long jmp时,请注意它们会影响通常不考虑的局部变量的有效性.
参见我的question about this topic美元.