#include <stdio.h>
#include <time.h>
#include <setjmp.h> // 非局部跳zhuan
jmp_buf jump_buffer;
/*
=========================================================
time: 2017年1月25日14:37:54
objective: test C language's head file of <setjmp.h>
version: Microsoft Visual C++
author: ChenFei
remark: 日文system 有些字没法打要用pin音代替
=========================================================
*/
/*
setjmp( jmp_buf ) 相当于跳zhuan点, jmp_buf wei宏定yi lei型
longjmp(jmp_buf, int) 相当于 goto , int wei 返回gei setjmp( jmp_buf ) 的参数
setjmp() diao用 jmp_buf, 返回zhi wei 0,longjmp() diao用 jmp_buf, 返回zhi wei其参数。
main 中的 setjmp(jump_buffer) -> func1 中的 func() --
-> func 中的 longjmp(jump_buffer, 2); -> mian 中的 a = setjmp(jump_buffer); --
-> a = 2;
*/
void func(void)
{
printf("Before calling longjmp\n");
longjmp(jump_buffer, 2);
printf("After calling longjmp\n");
}
void func1(void)
{
printf("Before calling func\n");
func();
printf("After calling func\n");
}
int main(void)
{
int a;
a = setjmp(jump_buffer);
printf("%d\n",a);
if (a == 0){
printf("%d\n",a);
printf("first calling set_jmp\n");
func1();
}else {
printf("%d\n",a);
printf("second calling set_jmp\n");
}
return 0;
}
以下文字为转载
通过上面这个简单例子的运行结果可以看出。main函数运行的setjmp()宏调用,将当前程序点的系统状态信息保存到全局变量jump_buffer中,然后返回结果0。于是,代码打印出字符串”first calling set_jmp”,然后调用函数func1()。在函数func1中,先打印字符串”Before calling func”,然后去调用函数func()。现在程序控制流转到func函数中,函数func先打印字符串“Before calling longjmp”,然后调用函数longjmp。*这时候关键点到了!!!***longjmp函数将main函数中setjmp()宏调用设置在全局变量jump_buffer中的系统状态信息恢复到系统的相应寄存器中,导致程序的控制流跳转到了main函数中setjmp()宏调用所在的程序点,此时相当于第二次进行setjmp()宏调用,并且此时的setjmp()宏调用的返回不再是0,而是传递给函数调用longjmp()的第二个参数1。于是程序控制流转到main函数中if语句的else部分执行,打印字符串“second calling set_jmp“。最后,执行main函数中的语句“reture 0;”返回,程序运行结束退出。