首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

setjmp

Defined in header <csetjmp>

#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)) { ..二次
  • 一个关系运算符或相等运算符的一个操作数与另一个操作数的整数常量表达式,其结果表达式是整个控制表达式。如果,,,开关,,,当,,,同时,,,为...

二次

代码语言:javascript
复制
if(setjmp(env) > 0) { ...

二次

  • 一个一元%21操作符的操作数,其结果表达式为如果,,,开关,,,当,,,同时,,,为...二次while(!setjmp(env)) { ...二次
  • 的整个表达式表达式语句%28可能投给void29%。

二次

代码语言:javascript
复制
setjmp(env);

二次

如果setjmp出现在任何其他上下文中,则行为未定义。

回到…的范围内setjmp,所有可访问对象、浮点状态标志和抽象机器的其他组件的值与std::longjmp被处决了,除了-易挥发局部变量setjmp%27s作用域,其值在setjmp调用后是否已更改,其值是不确定的。

参数

env

-

variable to save the execution state of the program to.

返回值

​0​如果宏由原始代码调用,并且执行上下文保存到env...

如果刚刚执行了非本地跳转,则为非零值。返回值与传递给std::longjmp...

二次

代码语言:javascript
复制
#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
    }
}

二次

产出:

二次

代码语言:javascript
复制
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的文档

代码语言:txt
复制
 © cppreference.com

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

扫码关注腾讯云开发者

领取腾讯云代金券