常见的goto语句也可以实现跳转,但是仅限于当前函数内,使用setjmp()和longjmp()函数可以实现跨函数跳转,主要用途是实现C语言的异常处理机制,这两个函数包含在头文件setjmp.h中。数据类型jmp_buf用于保存恢复调用环境所需的信息,即程序调用环境上下文,运行时的堆栈信息。
- setjmp(jmp_buf env);
使用env记录现在的位置,用于将来跳转回此处。该函数初始化env缓冲区,
env
将被longjmp
使用。如果是从setjmp
直接调用返回,setjmp
返回值为0。如果是从longjmp
恢复的程序调用环境返回,setjmp
返回非零值(这个非零值可由longjmp设置)。
- longjmp(jmp_buf env, int k);
回到env记录的位置,让它看上去像是从setjmp函数返回一样,该函数使setjmp函数返回 k,标记是由哪个longjmp函数返回的。特别的,如果k设置为0,setjmp返回1.
异常处理实例
注意事项:
要么声明为static,要么提到setjmp()之前声明,否则会出现编译错误。
crosses initialization of ‘char s [13]‘
Another Example
留下评论