/* 相关资料: 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
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!