gpt4 book ai didi

c - setjmp.h 中定义的 C 中的 Non-local Jumps 是如何工作的?

转载 作者:太空狗 更新时间:2023-10-29 16:08:04 26 4
gpt4 key购买 nike

C 引用手册,附录 B 描述了两个函数 setjmplongjmp 用于非局部跳转。除了基本了解 setjmp 保存状态信息和 longjmp 恢复 state 之外,我一直无法理解此功能的确切流程和用例。

那么,这个特性到底完成了什么,它有什么用处呢?

最佳答案

至于控制流:setjmp返回两次,longjmp永远不会返回。当您第一次调用 setjmp 时,为了存储环境,它返回零,而当您调用 longjmp 时,控制流传递到从 setjmp 返回 使用参数中提供的值。

(请注意,setjmp 实际上不必是函数;它很可能是一个宏。不过,longjmp 是一个函数。)

用例通常被称为“错误处理”和“不要使用这些功能”。

这是一个控制流程的小例子:

jmp_buf env;

void foo()
{
longjmp(&env, 10); +---->----+
} | |
| |
int main() (entry)---+ ^ V
{ | | |
if(setjmp(&env) == 0) | (= 0) | | (= 10)
{ | ^ |
foo(); +---->----+ |
} +---->----+
else |
{ |
return 0; +--- (end)
}
}

注意事项:

  • 您不能将 0 传递给 longjmp。如果这样做,setjmp 将返回 1

  • 在相应的longjmp 之前,您不能从调用setjmp 的函数返回。换句话说,longjmp 只能在调用堆栈中调用 above setjmp

  • (感谢@wildplasser:)您实际上无法存储 setjmp 的结果。如果你想以几种不同的方式返回,你可以使用 switch,不过:

    switch (setjmp(&env))
    {
    case 0: // first call
    case 2: // returned from longjmp(&env, 2)
    case 5: // returned from longjmp(&env, 5)
    // etc.
    }

关于c - setjmp.h 中定义的 C 中的 Non-local Jumps 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16636206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com