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 ++文档 |