关于c里面的setjmp和longjmp

本文详细解析了C语言中的setjmp和longjmp机制,它们用于实现复杂的功能跳转,避免了传统的goto语句可能导致的问题,特别是在深嵌套函数中。通过实例演示了如何正确使用这些函数来解决实际编程中的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于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");
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值