zoukankan      html  css  js  c++  java
  • linux系统编程:setjmp和longjmp函数用法

    #include <stdio.h>
    
    #include <setjmp.h>
    
    //jmp_buf:数组,保存栈信息即运行环境
    
    jmp_buf buf;
    
    double Divide(double a, double b)
    
    {
    
    if (b == 0.0)
    
    {
    
    longjmp(buf, 1); // throw
    
    }
    
    else
    
    return a / b;
    
    }
    
    //setjmp保存当前栈信息,成功返回0,当执行到longjmp时,
    
    //恢复栈信息即跳转到setjmp位置重新执行setjmp
    
    //且此次返回值根据longjmp函数参数给定
    
    int main(void)
    
    {
    
    int ret;
    
    ret = setjmp(buf);
    
    if (ret == 0) // try
    
    {
    
    printf("division ...
    ");
    
    printf("%f
    ", Divide(5.0, 0.0));
    
    }
    
    else if (ret == 1) // catch
    
    {
    
    printf("divisiong by zero
    ");
    
    }
    
    return 0;
    
    }

    运行结果:

    division ...

    divisiong by zero

    其实上次错误处理模式已经是c++异常处理雏形

    上述相当于:

    #include <iostream>
    
    using namespace std;
    
    double Divide(double a, double b)
    
    {
    
    if (b == 0.0)
    
    {
    
    throw 1; // throw
    
    }
    
    else
    
    return a / b;
    
    }
    
    int main(void)
    
    {
    
    try // try
    
    {
    
    cout<<"division ..."<<endl;
    
    cout<<Divide(3.0, 0.0)<<endl;
    
    cout<<Divide(5.0, 0.0)<<endl;
    
    }
    
    catch (int) // catch
    
    {
    
    cout<<"divisiong by zero"<<endl;
    
    }
    
    return 0;
    
    }

    运行结果同上

  • 相关阅读:
    jqGrid 各种参数 详解
    JqGrid自定义(图片)列
    win10以前连接过的wifi密码怎么查看
    C# 文件操作常用方法总结
    js LocalStorage
    list互转datatable 支持Nullable转换
    UVA 515 King
    UVA 558 Wormholes
    UVA 10986 Sending email 最短路问题
    UVA 10801 Lift Hopping 最短路
  • 原文地址:https://www.cnblogs.com/mickole/p/3258603.html
Copyright © 2011-2022 走看看