longjmp函数
概要:
#include <setjmp.h> _Noreturn void longjmp(jmp_buf env, int val);
描述:
该函数使用相应的参数env在程序的同一调用中恢复最近一次宏setjmp调用所保存的环境。
如果没有调用宏setjmp,或者如果宏setjmp的调用发生在其它线程中,或者如果包含宏setjmp调用的函数在此期间已经终止执行(例如:通过执行return语句,或者在嵌套调用中其它longjmp函数调用跳转至宏setjmp调用。),或者如果宏setjmp的调用在具有可变修改类型(variably modified type)的标识符的作用域内,并且在此期间程序执行离开了该作用域,上述情况下longjmp函数行为是未定义的。
截至longjmp函数调用时,所有可访问的对象都有值,抽象机的所有其它组件都有状态(这包括但不限于浮点状态标志和打开文件的状态。),除了具有自动存储期限对象的值是不确定的;这些具有自动存储期限的对象是包含对应setjmp宏调用的函数的本地对象,不具有volatile限定类型,并且在宏setjmp调用和函数longjmp调用之间发生了改变。
参数:
参数为一个jmp_buf类型的对象,包含最近一次setjmp宏调用环境的相关信息。
对应setjmp宏的返回值。
返回值:
函数无返回值。
该函数调用后,线程继续执行,就好像对应的setjmp宏调用刚刚返回了参数val指定的值。函数longjmp不能使宏setjmp返回0;如果参数val值为0,宏setjmp返回1。
范例:
|
|
输出:
The setjmp macro has been called.
Call the func function.
The code before the longjmp function in the func function will be executed.
The longjmp function has been called.
该程序首先评估if语句的控制表达式setjmp(environment),这次返回值来自宏setjmp的直接调用,所以值为0;接着执行第26、27行语句,然后调用func函数;执行longjmp(environment, 1);语句后,程序跳转至main函数的setjmp(environment)处;再次评估控制表达式setjmp(environment),这次返回值来自longjmp(environment, 1)函数调用,所以返回值为1;最后执行第22、23行语句。
相关内容:
jmp_buf | 保存调用环境相关信息的类型。 |
setjmp | 保存调用环境的宏。 |