©
本文檔使用 php中文網手册 發布
在头文件<setjmp.h>中定义 | ||
---|---|---|
#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) calleda(2) calleda(3) calleda(4) calleda(5) calleda(6) calleda(7) calleda(8) called
C11标准(ISO / IEC 9899:2011):
7.13.1.1 setjmp宏(p:262-263)
C99标准(ISO / IEC 9899:1999):
7.13.1.1 setjmp宏(p:243-244)
C89 / C90标准(ISO / IEC 9899:1990):
4.6.1 setjmp宏
longjmp | 跳转到指定的位置(功能) |
---|
| 用于setjmp的C ++文档 |