跳转函数

为什么要有个函数间的跳转呢,这是因为,如果我们在调用函数时,函数的调用的嵌套的层次很深的话,如果出错,那么一层一层的返回和判断就很麻烦,所以,如果出错,就可以直接返回到最上面的调用的函数就会很方便。
我们来看一下这两个函数怎么使用,首先看一下这两个函数的原型:

#include
int setjmp(jmp_buf env);   //直接调用则返回0,如从longjmp调用则返回非0

int longjmp(jmp_buf env, int val);


jum_buf是一个类型,其中env存储了一些longjmp调用返回用来恢复栈状态的所有信息。longjmp中的env和setjmp中的 env是同一个。val是程序员自定义的直,这个值用在setjmp的返回值中,这样我们就可以知道是在哪个的longjmp跳转回来的。另外,由于在不 同的函数间调用setjmp和longjmp,而这两个函数要公用一个env变量,所以把env定义为一个全局变量

#include 
#include 
jmp_buf buf;
banana()
{
	printf("aaaa\n");
	longjmp(buf,1);
	//以下代码不会被执行
	printf("bbbb\n");
}
int main(int argc, char const *argv[])
{
	if (setjmp(buf) != 0)
	{
		printf("cccc\n");
	}
	else
	{
		printf("dddd\n");
		banana();
	}
	return 0;
}
运行结果:
dddd
aaaa
cccc
Press any key to continue


前面我们说过longjmp函数中的val参数用来確定我们的jump是在哪产生的,下面我们修改一下前面的例子,看看怎样区别不同的跳转点。


#include 
#include 
jmp_buf jmpbuffer;
void func1();
void func2();
int main(void)
{
 printf("in main function!\n ");
 int errNum = 0;
 errNum = setjmp(jmpbuffer);
 if(errNum != 0)
 {
  if (errNum == 1)
  {
   printf("get the error from func1 function !\n ");
  func2();
  }
  if (errNum == 2)
   printf("get the error from func2 function !\n ");
  return -1;
 }
 func1();

 printf("main function end!\n ");
 return 0;
}
void func1()
{
 printf("in func1 function!\n ");
 longjmp(jmpbuffer, 1);
 func2();
}
void func2()
{
 printf("in func2 function!\n ");
 longjmp(jmpbuffer, 2);
}
运行结果:
in main function!
 in func1 function!
 get the error from func1 function !
 in func2 function!
 get the error from func2 function !
 Press any key to continue



你可能感兴趣的:(C语言)