setjmp

setjmp

在头文件中定义
#define setjmp(env)/ *实现定义的* /

将当前执行上下文保存到类型为jmp_buf的变量env中。 此变量稍后可用于通过longjmp函数恢复当前执行上下文。 也就是说,当调用longjmp函数时,执行继续在构造传递给longjmp的jmp_buf变量的特定调用位置。 在这种情况下,setjmp返回传递给longjmp的值。

setjmp的调用只能出现在下列其中一个环境中:

  • 选择或迭代语句的整个控制表达式(if,switch,for,while,do-while)

switch(setjmp(env)) { ..

  • 一个关系或相等运算符的操作数,另一个操作数是一个整型常量表达式,结果表达式是选择或迭代语句的整个控制表达式

if(setjmp(env) > 10) { ...

  • 一元操作数!运算符的结果表达式是选择或迭代语句的完整控制表达式

while(!setjmp(env)) { ...

  • 表达式语句的整个表达式(可能转换为void)。

setjmp(env

如果setjmp出现在任何其他上下文中,则行为是未定义的。

返回到setjmp的范围后,抽象机器的所有可访问对象,浮点状态标志和其他组件都具有与执行longjmp时相同的值,除了setjmp作用域中的非易失性局部变量如果自从setjmp调用以来它们已被更改,则值是不确定的。

参数

env-变量来保存程序的执行状态。

返回值

如果宏由原始代码调用并且执行上下文已保存到env,则返回0。

如果非本地跳转刚刚执行,则返回的是非0值。 返回值与传递给longjmp的返回值相同。

#include <stdio.h> #include <setjmp.h> #include <stdnoreturn.h> jmp_buf jump_buffer; noreturn void a(int count) { printf("a(%d) called\n", count longjmp(jump_buffer, count+1 // will return count+1 out of setjmp } int main(void) { volatile int count = 0; // modified local vars in setjmp scope must be volatile if (setjmp(jump_buffer) != 9) // compare against constant in an if a(++count }

输出:

a(1) called a(2) called a(3) called a(4) called a(5) called a(6) called a(7) called a(8) called

参考

  • C11标准(ISO / IEC 9899:2011):

扩展内容

longjmp跳转到指定的位置(功能)

| 用于setjmp的C ++文档 |