zoukankan      html  css  js  c++  java
  • C语言setjmp函数使用

    C语言中可以使用goto进行程序跳转,但是goto只能使用在一个函数内部,不能实现在不同函数之间的跳转,C语言因此提供了setjmp和longjmp函数实现此功能,一般进行异常处理。
    从函数名称可以看到,一个是设置跳转点,另一个实现长距离的跳转。我们可以再一个函数内部调用setjmp函数设置一个跳转点,在另一个函数中调用longjmp进行跳转,我们需要定义一个jmp_buf类型变量保存跳转信息。
    eg:
     
    jmp_buf jb ;
     
    void main ()
    {
        if (setjmp (jb) == 0)
        {
            longjmp(jb , 1);
        }
        else
        {
            printf("jmp point 1" );
        } 
    }
    调用longjmp调用时,第二参数会作为setjmp函数的返回值,因此我们还可以用一个switch语句多个分支进行处理。
    eg:
    jmp_buf jb ;
     
    void main ()
    {
        int code = setjmp( jb);
        switch(code )
        {
        case 0:
            longjmp(jb , 1);
            break;
        case 1:
            printf("jmp point 1" );
            break;
        default:
            printf("jmp point code is : %d" , code);
            break;
        }
    }
    看云风的说法,调用longjmp跳转时并不是在汇编级别的直接跳转,还进行了其他操作,看汇编我们也可以看到,程序并不是进行直接跳转,而是进行了一大堆操作,这样的跳转可以用作一场处理,类似于C++中的try,catch操作,我自己没有大量用过,网上说法是在不熟悉的情况下不赞成使用,这些函数也只在大型的项目中使用,而且程序员对此函数的用法十分娴熟。
  • 相关阅读:
    codeforces 466D
    codeforces 360B
    codeforces 383D
    codeforces 679B
    codeforces 571B
    codeforces 494B
    CodeForces 660D Number of Parallelograms(n个点所能组成的最多平行四边形数量)
    算法竞赛模板 最短路
    算法竞赛模板 string中substr函数的运用
    HDOJ 1269 迷宫城堡(tarjan模板题)
  • 原文地址:https://www.cnblogs.com/ourroad/p/3212286.html
Copyright © 2011-2022 走看看