setjmp将当前程序的运行环境存储在一个jump_buf类型的全局变量中(因为后续要被longjmp调用)
第一次调用setjmp的返回值是null
中后续的代码中执行到longjmp以后,longjmp需要两个参数,一个是之前setjmp保存到运行环境的全局变量可以调整到setjmp函数
另一个参数是setjmp函数的返回值,然后程序执行会跳转到setjmp函数并返回longjmp的第二个参数
通常应将setjmp放在各种条件控制语句中if switch while等
一个例子,参考dash文档
Example
#include <stdio.h> #include <setjmp.h> #include <stdnoreturn.h> jmp_buf jump_buffer; noreturn void a(int count) { printf("a(%d) called\n", count); longjmp(jump_buffer, count+1); // will return count+1 out of setjmp } int main(void) { volatile int count = 0; // modified local vars in setjmp scope must be volatile if (setjmp(jump_buffer) != 9) // compare against constant in an if a(count++); }
Output:
a(0) called a(1) called a(2) called a(3) called a(4) called a(5) called a(6) called a(7) called a(8) called