关于c里面的setjmp和longjmp

关于c里面的setjmp和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");
}




你可能感兴趣的:(c,System)