1) goto
goto 只能在一个函数内跳转。建议少用,使得程序维护起来容易出错;但是,在有多个循环情况下跳转,有时用goto可以使得问题变得简单。
一个例子
class A
{
public:
A(){}
~A(){}
};
int main()
{
{
A a;
goto Label1;
}
Label1:
cout<<”end”<<endl;
return 0;
}
2) setjmp/longjmp
非局部跳转(nonlocal goto),可用于在不同函数内跳转,但是不会调用析构函数(vc++是会的,但是别的编译器可能不会,不具备移植性)。使用步骤如下:
l include <setjmp.h>
l jmp_buf JumpBuffer
//跳转的位置结构
l setjmp(JumpBuffer)
保存当前的位置,将来跳转到这里
l longjmp(JumpBuffer, 整数)
这个整数会成为setjmp的返回值。
一个例子
jmp_buffer jmpbuf; //用以保存处理器相关的状态信息(栈信息等)
void Func()
{
cout << “ get in ” <<endl;
A a;
longjmp(jmpbuf, 1);
cout << “ never get here ”<<endl;
}
int main()
{
cout << “ get in main ” <<endl;
if( setjmp (jmpbuf ) == 0 )
{
cout<<”set lable”<<endl;
Func();
}
else //1
{
cout<<” jmp to here”<<endl;
}
}