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;
    
    }

    运行结果同上

  • 相关阅读:
    css--一些基本属性
    python网络编程--TCP连接的三次握手(三报文握手)与四次挥手
    python--基础数据类型 set集合
    图片
    python--变量,常量,用户交互
    前端基础--css基本语法,选择器
    Python----一些面试题
    HTML--基本标签
    集合类型
    字典类型
  • 原文地址:https://www.cnblogs.com/mickole/p/3258603.html
Copyright © 2011-2022 走看看