和goto类似,可以实现跳转。但,goto只能在当前函数内跳转,setjmp/longjmp可以任意跳转
setjmp:保存上下文到buf,下次使用longjmp(),可以跳转到此处
longjmp:跳转到buf变量保存的上下文处
注意事项:
longjmp使用前,必须先setjmp,保存上下文,才能通过longjmp跳转到保存上下文的地方。否则 Segmentation fault
用例:
#include <stdio.h>
#include <setjmp.h>
jmp_buf buf;
void Banana(void)
{
printf("In Banana()\n");
longjmp(buf,1); //跳转到buf变量,最新setjmp的地方。并给setjmp返回1
printf("You'll never see this ,because longjmp\n");
}
int main(void)
{
if(setjmp(buf)) //调用setjmp(),保存上下文到buf,下次使用longjmp(),跳转到此处
{
printf("Back in main\n");
}
else
{
printf("First time through\n");
Banana();
}
return 0;
}
运行结果