是否应该longjmp恢复堆栈?

use*_*954 2 c c++ longjmp setjmp

据我了解,setjmp保存当前上下文,并且应该在调用时还原它longjmp。但是,下一段代码将显示15(我使用-g编译,没有进行任何优化)。我是不是误解了这种结构,还是想念其他东西?

#include <iostream>
#include <csetjmp>


std::jmp_buf jump_buffer;

int main()
{
    int a = 0;
    if (setjmp(jump_buffer) == 0) {
      a = 15;
      std::longjmp(jump_buffer, 42);
    }
    std::cerr << a << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

免责声明:仅出于好奇而尝试使用它。直到最近我阅读了一些有关NASA编码准则的论文,并提到禁止使用这种控制结构流程之后,我才听说过这种结构。

因为代码是混合的,所以同时使用c和c ++标记,并且我认为实际的相关功能与c重度用户更相关,而不是c ++ ...:/

Sto*_*ica 5

这是预期的行为

返回setjmp的范围后,抽象机的所有可访问对象,浮点状态标志和其他组件的值与std::longjmp执行时的值相同,setjmp范围中的非易失性局部变量除外。如果值自setjmp调用以来已更改,则它们是不确定的

a在执行时longjmp是15,所以这是一个值一个可以期望看到(它的不确定,一般)。该jmp_buf只存储的执行点。不是程序中每个变量的状态。

  • @ user2717954-标准C和C ++中的`goto`不能跨越函数边界。 (2认同)