16.4 非本地跳转<setjmp.h>
setjmp和longjmp函数提供了一种类似goto语句的机制,但它并不局限于一个函数的作用域之内。这些函数常用于深层嵌套的函数调用链。如果在某个低层的函数中检查到一个错误,可以立即返回到顶层函数,不必向调用链中的每个中间层函数返回一个错误标志。
要使用这些函数,则必须包含头文件setjmp.h。这两个函数的原型如下所示:
int setjmp( jmp_buf state );
void longjmp( jmp_buf state, int value );
声明一个jmp_buf变量,并调用setjmp函数对它进行初始化,setjmp的返回值为零。setjmp把程序的状态信息(例如,堆栈指针的当前位置和程序的计数器)保存到跳转缓冲区(程序当前正在执行的指令的地址)。调用setjmp时所处的函数便成为“顶层”函数。以后,在顶层函数或其他任何它所谓的函数(不论是直接还是间接调用)内的任何地方调用longjmp函数时,将导致这个被保存的状态重新恢复。longjmp的效果就是使执行流通过再次从setjmp函数返回,从而立即跳回到顶层函数中。
如何区别从setjmp函数的两种不同返回方式呢?当setjmp函数第1次被调用时,它返回0。当setjmp作为longjmp的执行效果再次返回时,它的返回值是longjmp的第2个参数,它必须是个非零值。通过检查它的返回值,程序可以判断是否调用了longjmp。如果存在多个longjmp,也可以由此判断调用了哪个longjmp。
16.4.1 实例
程序16.2使用setjmp来处理它所调用的函数检测到的错误,但无须使用寻常的返回和检查错误代码的逻辑。setjmp的第一次调用确立了一
C和指针 第16章 标准函数库 16.4 非本地跳转<setjmp.h>
于 2022-07-12 17:33:22 首次发布
C和指针 第16章 标准函数库 16.4 非本地跳转
摘要由CSDN通过智能技术生成