#include <setjmp.h>
#include <iostream>
jmp_buf buf;
void error_one(void)
{
longjmp(buf,1);
}
void error_two(void)
{
longjmp(buf,2);
}
void dispatch(int var, int change)
{
var = 23;
change = 50;
srand((unsigned long)time(NULL));
if ((random() % 2) == 0)
{
error_one();
}
else
{
error_two();
}
}
int main(int argc, char* argv[])
{
int auto_var = 10;
volatile int var = 12;
switch (setjmp(buf))
{
case 0:
std::cout<<"main function/t"<<auto_var<<var<<std::endl;
break;
case 1:
std::cout<<"error one return/t"<<auto_var<<var<<std::endl;
return -1;
case 2:
std::cout<<"error two return"<<auto_var<<var<<std::endl;
return -2;
default:
return -3;
}
dispatch(auto_var++, var++);
}
当没有使用任何优化时,和使用优化时,会输出不同的结果。
jmp_buf类型的变量用来记录必要的信息,例如记录setjmp时的esp,记录longjmp时候返回值。
volatile关键字指示编译器不要对后面的变量优化,直接采用存储器分配空间,而且栈内分配空间。
setjmp函数,记录必要的信息,例如esp的值,并且设定返回值为0
longjmp函数,跳到buf的设定处即setjmp处,并且设定返回值为指定值.
#include <iostream>
jmp_buf buf;
void error_one(void)
{
longjmp(buf,1);
}
void error_two(void)
{
longjmp(buf,2);
}
void dispatch(int var, int change)
{
var = 23;
change = 50;
srand((unsigned long)time(NULL));
if ((random() % 2) == 0)
{
error_one();
}
else
{
error_two();
}
}
int main(int argc, char* argv[])
{
int auto_var = 10;
volatile int var = 12;
switch (setjmp(buf))
{
case 0:
std::cout<<"main function/t"<<auto_var<<var<<std::endl;
break;
case 1:
std::cout<<"error one return/t"<<auto_var<<var<<std::endl;
return -1;
case 2:
std::cout<<"error two return"<<auto_var<<var<<std::endl;
return -2;
default:
return -3;
}
dispatch(auto_var++, var++);
}
当没有使用任何优化时,和使用优化时,会输出不同的结果。
jmp_buf类型的变量用来记录必要的信息,例如记录setjmp时的esp,记录longjmp时候返回值。
volatile关键字指示编译器不要对后面的变量优化,直接采用存储器分配空间,而且栈内分配空间。
setjmp函数,记录必要的信息,例如esp的值,并且设定返回值为0
longjmp函数,跳到buf的设定处即setjmp处,并且设定返回值为指定值.
2万+

被折叠的 条评论
为什么被折叠?



