#include <setjmp.h>
int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int val);
setjmp()设置跳转点,参数env用于保存运行环境(估计主要是寄存器值);
setjmp()本身返回时,返回值为0,若是从longjmp()返回,longjmp()的参数val就是setjmp()的返回值;
longjmp()跳转到参数env所设置的跳转点,参数val为setjmp()的返回值;
由于setjmp()保存了寄存器值,所以保存在寄存器里的变量在从longjmp()返回后,会被恢复为保存时的值。这种情况多见于进行了程序优化的代码,将auto、register变量保存在寄存器里面。而global、static、volatile变量不会被恢复(也即无论怎么优化,这三类变量也不会保存到寄存器里);