setjmp
来自 cppreference.com
定义在头文件 <setjmp.h> 中 |
||
#define setjmp(env) /* 实现定义的 */ |
||
将当前执行上下文保存到 env
变量中,env
变量的类型为 jmp_buf。稍后可以使用此变量通过 longjmp 函数恢复当前执行上下文。也就是说,当调用 longjmp 函数时,执行将继续在构造传递给 longjmp 的 jmp_buf 变量的特定调用站点处继续。在这种情况下,setjmp
返回传递给 longjmp 的值。
setjmp
的调用只能出现在以下上下文之一中
- if、switch、while、do-while、for 的整个控制表达式。
switch(setjmp(env)) { // ...
- 关系运算符或相等运算符的一个操作数,另一个操作数是一个整数常量表达式,生成的表达式是 if、switch、while、do-while、for 的整个控制表达式。
if(setjmp(env) > 10) { // ...
- 一元 ! 运算符的操作数,生成的表达式是 if、switch、while、do-while、for 的整个控制表达式。
while(!setjmp(env)) { // ...
- 表达式语句 的整个表达式(可能被强制转换为
void
)。setjmp(env);
如果 setjmp
出现在任何其他上下文中,则行为未定义。
返回到 setjmp
的作用域后
- 所有可访问的对象、浮点状态标志和抽象机的其他组件都具有与执行 longjmp 时相同的数值,
- 除了包含
setjmp
调用的函数中的非-volatile 局部变量,如果这些变量自setjmp
调用后已更改,则它们的数值是不确定的。
内容 |
[编辑] 参数
env | - | 用于保存程序执行状态的变量。 |
[编辑] 返回值
0 如果宏是由原始代码调用的,并且执行上下文已保存到 env
中。
如果刚刚执行了非本地跳转,则为非零值。返回值与传递给 longjmp 的值相同。
[编辑] 说明
上述要求禁止在数据流中使用 setjmp
的返回值(例如,用它初始化或为它分配对象)。返回值只能用于控制流或被丢弃。
[编辑] 示例
运行此代码
#include <stdio.h> #include <setjmp.h> #include <stdnoreturn.h> jmp_buf my_jump_buffer; noreturn void foo(int status) { printf("foo(%d) called\n", status); longjmp(my_jump_buffer, status + 1); // will return status+1 out of setjmp } int main(void) { volatile int count = 0; // modified local vars in setjmp scope must be volatile if (setjmp(my_jump_buffer) != 5) // compare against constant in an if foo(++count); }
输出
foo(1) called foo(2) called foo(3) called foo(4) called
[编辑] 参考资料
- C17 标准 (ISO/IEC 9899:2018)
- 7.13.1.1 setjmp 宏 (p: 191)
- 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 宏
[编辑] 另请参阅
跳转到指定位置 (函数) | |
C++ 文档 对于 setjmp
|