zoukankan      html  css  js  c++  java
  • setjmp和longjmp

    /*
    相关资料:
    http://msdn.microsoft.com/en-us/library/xe7acxfb(v=vs.80).aspx
    http://www.cnblogs.com/chio/archive/2008/10/06/1305109.html
    http://blog.chinaunix.net/u/12592/showart_1870867.html

    setjmp和longjmp都是用汇编编写的,不完全遵循C的规律。
    */

    #include
    <setjmp.h>
    #include
    <conio.h>
    #include
    <iostream>
    using namespace std;

    typedef
    int ArrayInt[2];

    int main(int argc, char* argv[])
    {
    int num = -1;
    jmp_buf env;
    int state = setjmp(env);
    if(0 == state)
    {
    cin
    >>num;
    if(num != 0)
    {
    // longjmp会跳转到if(0 == state)一句,并改变state的值。
    // 是不是很诡异?因为longjmp内部将eax寄存器的值设置成
    // 其第二个参数的值(本例中为1),在恢复寄存器值的时候,
    // eip被恢复到上一个setjmp中,因此setjmp的返回值变为longjmp的返回值。
    // (C语言的调用规约规定,使用eax保存返回值;eip是指令指针寄存器)
    longjmp(env, 1);
    }
    }
    else
    {
    // 错误处理
    cout<<"Error!"<<endl;
    }

    // 显示8。ArrayInt是包含2个int的数组类型。
    // 但是,当ArrayInt作为参数传递的时候却是指针传递。
    // 在MS C/C++中jmp_buf的定义为typedef _JBTYPE jmp_buf[_JBLEN];
    cout<<sizeof(ArrayInt)<<endl;

    // 创建和赋值
    ArrayInt ary;
    ary[
    0] = 0;
    ary[
    1] = 1;

    getch();
    return 0;
    }
  • 相关阅读:
    DBA常用脚本 二、性能监控
    ORA01012:not logged on的解决办法
    线性布局LinearLayout
    Android Handler.postDelayed()方法
    java String.valueOf()
    布局管理器ViewGroup
    UE3的数据绑定笔记
    概念、实现和沟通
    DirectX11的Shader Reflect的几个问题(2012222更新)
    测试livewriter
  • 原文地址:https://www.cnblogs.com/lilei9110/p/1908151.html
Copyright © 2011-2022 走看看