setjmp_demo
【引用】
https://www.cnblogs.com/yangxunwu1992/p/5875254.html
【demo代码】
#include <stdio.h> #include <setjmp.h> void change(int r, int s, int a, int v); jmp_buf state; int main() { register int r = 1; static int s = 1; register int a = 1; volatile int v = 1; if(setjmp(state)){ printf("1 r:%4d s:%4d a:%4d v:%4d\n", r, s, a, v); return 0; } r = s = a = v = 999; change(r, s, a ,v); return 1; } void change(int r, int s, int a, int v) { printf("2 r:%4d s:%4d a:%4d v:%4d\n", r, s, a, v); //r寄存器变量,跳转时r是setjmp时的值 longjmp(state, 1); }
执行结果
1)setjmp保存当前寄存器的值
2)调用longjmp跳转过去
【说明】
1) 声明jmp_buf
2) setjmp
调用函数保存在jmp_buf中的参数中
3)longjmp函数
说明:
使用相应的jmp_buf参数来恢复程序中宏setjmp最近一次调用保存的环境
函数返回值:
longjmp完成后,程序继续执行,就好像setjmp的调用返回了val的值