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

    运行结果同上

  • 相关阅读:
    How Default Heap Of Process Grows
    希腊字母表
    Ubuntu第一次亲密接触
    Ubuntu中的挂载点(mount point)
    要一专多能
    First touch with JIT debugging
    小学一下环境变量
    安装VMware Tools
    [转]ReiserFS与ext3的比较
    [bbk4485]第二章Flashback Database 05
  • 原文地址:https://www.cnblogs.com/mickole/p/3258603.html
Copyright © 2011-2022 走看看