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

原文链接: https://www.cnblogs.com/lilei9110/archive/2010/12/16/1908151.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/18864

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午7:47
下一篇 2023年2月7日 下午7:47

相关推荐