关于c里面的setjmp和longjmp
本来goto 不能跳转到函数外部,于是提出了这个jmp跳转,可以从嵌套很
深的地方,跳转到setjmp定义的地方。
longjmp会跳转到setjmp定义的地方,而不是调用的地方。
所以如果把setjmp代码放进main函数里面会造成死循环(因为后面func1又在调用longjmp)
本来goto 不能跳转到函数外部,于是提出了这个jmp跳转,可以从嵌套很
深的地方,跳转到setjmp定义的地方。
longjmp会跳转到setjmp定义的地方,而不是调用的地方。
所以如果把setjmp代码放进main函数里面会造成死循环(因为后面func1又在调用longjmp)
如果setjmp代码和longjmp在一个函数里面就悲剧了,会造成死循环
------------------------------------------------------------------------------------
例子1:
/* longjmp example */
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
main()
{
jmp_buf env;
int val;
val=setjmp(env);
printf ("val is %d\n",val);
if (!val) longjmp(env, 1);
return 0;
}
例子2:
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
jmp_buf jumper;
void Func1()
{
longjmp(jumper,1);
/* longjmp会跳转到setjmp定义的地方,而不是调用的地方。
所以如果把setjmp代码放进main函数里面会造成死循环(因为后面func1又在调用longjmp)
*/
//永不执行
// printf("func1 out\n");
}
void Func2()
{
longjmp(jumper,2);
}
void Func3()
{
longjmp(jumper,-1);
}
//错误处理模块
void SetExceptionHandler()
{
switch ( setjmp(jumper) )
{
case 0:
//第一次设置,正常
break;
case 1:
printf( "error 1\n");
break;
case 2:
printf( "error 2\n");
break;
default :
printf( "unknown error\n");
break;
}
}
int main()
{
SetExceptionHandler();
/*把上面函数的代码直接放进来就悲剧了*/
Func1();
Func2();
Func3();
system("pause");
}