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;
    }
  • 相关阅读:
    UIWebView的高度不对问题
    SQL --分组【Group By】
    SQL--Order By
    SQL--空值处理
    SQ--模糊查询
    SQL 聚合函数
    SQL 语句的TOP,Distinct语句
    SQL约束
    1 翻译系列:什么是Code First(EF 6 Code First 系列)
    终极版:由简单工厂模式,升级到抽象工厂模式(用到反射)
  • 原文地址:https://www.cnblogs.com/lilei9110/p/1908151.html
Copyright © 2011-2022 走看看