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;
    }
  • 相关阅读:
    ubuntu下如何批量修改文件后缀名
    vanilla
    Ubuntu apt-get 彻底卸载软件包
    Kendall Rank(肯德尔等级)相关系数
    图像质量评估(IQA)
    conda常用命令
    在ubuntu中搜索文件或文件夹的方法
    libstdc++.so.6: version `GLIBCXX_3.4.21' not found
    迅雷磁力链接转BT种子工具
    springboot 集成mybatis plus3
  • 原文地址:https://www.cnblogs.com/lilei9110/p/1908151.html
Copyright © 2011-2022 走看看