setjmp
在头文件<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) 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): 
- 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 ++文档 |
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com

