使用setjmp和longjmp的基本流程如下:
在需要保存状态信息的位置调用setjmp函数,并将其返回值存储在一个变量中,以备后续使用。
在需要跳转到之前保存的状态信息处时,调用longjmp函数并传入之前记录下来的变量以及跳转目标。
以下是示例代码:
#include <stdio.h>
#include <setjmp.h>
jmp_buf env;
void foo() {
printf("entering foo\n");
longjmp(env, 1); // 跳转到 setjmp 中记录的位置
printf("exiting foo\n"); // 不会执行
}
int main() {
if (setjmp(env) == 0) { // 第一次调用 setjmp ,返回值为 0
printf("calling foo\n");
foo();
printf("exiting main\n"); // 不会执行
} else { // 第二次通过 longjmp 跳转回来了
printf("back in main\n");
}
return 0;
}
上述代码先调用了foo函数,然后在其中通过longjmp跳转回setjmp处。由于此时返回值不为0,因此程序进入else分支,并输出”back in main”。如果没有跳转,则会输出”exiting foo”和”exiting main”。