setjmp
赛特吉普
Defined in header | | |
---|---|---|
#define setjmp(env) /* implementation-defined */ | | |
将当前执行上下文保存到变量中。env
类型std::jmp_buf
此变量稍后可用于通过以下方式还原当前执行上下文:std::longjmp
功能。也就是说,当一个电话std::longjmp
函数,则在构造std::jmp_buf
变量传递给std::longjmp
.在这种情况下setjmp
返回传递给std::longjmp
...
引用setjmp
必须仅在下列情况之一出现:
- 整个控制表达如果,,,开关,,,当,,,同时,,,为二次switch(setjmp(env)) { ..二次
- 一个关系运算符或相等运算符的一个操作数与另一个操作数的整数常量表达式,其结果表达式是整个控制表达式。如果,,,开关,,,当,,,同时,,,为...
二次
if(setjmp(env) > 0) { ...
二次
- 一个一元%21操作符的操作数,其结果表达式为如果,,,开关,,,当,,,同时,,,为...二次while(!setjmp(env)) { ...二次
- 的整个表达式表达式语句%28可能投给
void
29%。
二次
setjmp(env
二次
如果setjmp
出现在任何其他上下文中,则行为未定义。
回到…的范围内setjmp
,所有可访问对象、浮点状态标志和抽象机器的其他组件的值与std::longjmp
被处决了,除了-易挥发局部变量setjmp
%27s作用域,其值在setjmp
调用后是否已更改,其值是不确定的。
参数
env | - | variable to save the execution state of the program to. |
---|
返回值
0
如果宏由原始代码调用,并且执行上下文保存到env
...
如果刚刚执行了非本地跳转,则为非零值。返回值与传递给std::longjmp
...
例
二次
#include <iostream>
#include <csetjmp>
std::jmp_buf jump_buffer;
[[noreturn]] void a(int count)
{
std::cout << "a(" << count << ") called\n";
std::longjmp(jump_buffer, count+1 // setjump() will return count+1
}
int main()
{
volatile int count = 0; // modified locals in setjmp scope must be volatile
if (setjmp(jump_buffer) != 9) { // equality against constant expression in an if
a(++count // This will cause setjmp() to exit
}
}
二次
产出:
二次
a(1) called
a(2) called
a(3) called
a(4) called
a(5) called
a(6) called
a(7) called
a(8) called
二次
另见
longjmp | jumps to specified location (function) |
---|
c关于setjmp的文档
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。