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/p/1908151.html