在线文档教程
C++
应用 | Utilities

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可能投给void29%。

二次

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

二次

另见

longjmpjumps to specified location (function)

c关于setjmp的文档

© cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

http://en.cppreference.com/w/cpp/实用程序/Program/setjmp