* nonlocal.cpp
*
* Created on: 2013-5-30
* Author: msm
*/
#include <iostream>
#include<csetjmp>
using namespace std;
class Rainbow{
public:
Rainbow(){cout << "Rainbow()"<<endl;}
~Rainbow(){cout << "~Rainbow()"<< endl;}
};
jmp_buf kansas;//初始化变量kansas,存储与处理器有关的状态信息;
void oz(){
Rainbow rb;
for(int i = 0 ; i < 3 ; i ++){
cout<< "there is no place like home"<<endl;
longjmp(kansas,47);
}
}
int main(){
if(setjmp(kansas) == 0){//----------------1
cout<< "tronado"<<endl;
oz();
}else{
cout<<"Auntie em!"<<endl;
}
}
//此处的setjmp()函数将所有与当前处理器相关的状态信息保存到jmp_buf中,
//在函数oz()中longjmp()调用,此时会返回到调用setjmp的地方(即1处),此时返回值为第二个参数即47;
//不满足条件,执行else
//处理结果:
/*tronado
Rainbow()
there is no place like home
Auntie em!*/
/*
* Nonlocal.cpp
*
* Created on: 2013-5-30
* Author: msm
*/
#include <iostream>
using namespace std;
class Rainbow{
public:
Rainbow(){cout<< "rainbow()"<<endl;}
~Rainbow(){cout<< "~rainbow()"<<endl;}
};
void oz(){
Rainbow rb;
for(int i = 0; i < 3;i++)
cout<< "there is no place like home!"<<endl;
throw 47;
}
int main(){
try{
cout<< "tornado"<<endl;
oz();
}catch(int){
cout << "Auntie Em!"<< endl;
}
}
//与前一个类似,不过是完整的调用了析构函数;
//结果:
/*tornado
rainbow()
there is no place like home!
there is no place like home!
there is no place like home!
~rainbow()
Auntie Em!
*/