setjmp.h 中定义的 C 语言非本地跳转如何工作?

2024-02-27

The C语言参考手册,附录B描述了两个函数setjmp and longjmp对于所谓的东西非局部跳转。除了基本的了解之外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)
    }
}

Notes:

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

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

  • (感谢@wildplasser:)你实际上不能store的结果setjmp。如果您想以多种不同的方式返回,您可以使用switch, 尽管:

    switch (setjmp(&env))
    {
    case 0:   // first call
    case 2:   // returned from longjmp(&env, 2)
    case 5:   // returned from longjmp(&env, 5)
    // etc.
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

setjmp.h 中定义的 C 语言非本地跳转如何工作? 的相关文章

随机推荐

  • .net 与 Objective c SHA-512 不匹配

    我正在尝试编写用于从 net 函数在目标中创建 sha512 字符串的函数 该函数是 public static string GetSHA512 string strPlain UnicodeEncoding UE new Unicode
  • 在 Express REST API 中使用 OOP 的最佳方式?

    我将全力以赴并仅使用节点来做一个项目 这很有趣 但有时我会有点迷失其中 当我感到困惑时 我想尝试获得理解 这样我就可以正确地构建它 并且不会太不知所措 不管怎样 问题是这样的 我有使用 Express 和 mysql 的 REST API
  • Jackson Scala 模块的小例子?

    任何人都可以向我指出 Jackson 序列化 反序列化及其 2 10 的 Scala 模块的简单示例吗 我正在寻找基于反射的 JSON 不需要逐个字段注释或分配 这似乎可以做到这一点 但他们的文档不包含任何示例 如果我有一个案例类 case
  • 如何解压 .asar 文件?

    我使用以下命令打包了我的 Electron 应用程序 asar pack app app asar 现在 我需要解压它并取回整个代码 有什么办法可以做到吗 来自阿萨尔文档 https github com electron asar 指某东
  • 如何通过 Maven 使用 Netbeans 调试 Spring Boot

    经过很长时间的摆弄 直到我在 Netbeans 8 2 和 Spring Boot 1 4 3 中得到了正确的调试设置 我想我应该把我的发现写下来作为其他人的问答 问题是 Netbeans 的默认配置无法在调试模式下正确启动 Spring
  • Jetpack Compose:如何禁用浮动操作按钮?

    根据docs https developer android com reference kotlin androidx compose material package summary FloatingActionButton kotli
  • 检索与 Perl 中的所有正则表达式完全匹配的模式

    我有一个子图数据库 如下所示 t 3 231 1 v 0 94 v 1 14 v 2 16 v 3 17 u 0 1 2 u 0 2 2 u 0 3 2 t 3 232 1 v 0 14 v 1 94 v 2 19 v 3 91 u 0 1
  • 将不同日期范围内的相似对象分组以获取 SQL Server 中的最小和最大日期

    我有一张桌子 account onln status browse status beg date end date 123456789 On Y 1 1 2018 2 1 2018 123456789 On N 2 2 2018 4 1
  • 为什么这个分配的对象与原始对象共享相同的内存空间?

    在 python 中 我在使用 itertools groupby 模块时遇到了这种奇怪的现象 在Python中 变量赋值意味着将新变量分配给它自己的内存 而不是指向原始内存的指针 根据我的理解 如果这是不正确的 请告诉我 y 7 x y
  • 通过 WebApp 与本地 PC 交互

    我目前正在开发一个公司内部网应用程序 部分要求是让应用程序在用户本地 PC Minitab 上启动一个程序 然后让 Web 应用程序通过其 COM 接口与其进行通信 做这样的事情我有什么选择 一个签名的 Java 小程序和Jacob htt
  • 在 JavaScript 中计算两个数组的交集[重复]

    这个问题在这里已经有答案了 给定两个长度不等的数组 var arr1 mike sue tom kathy henry arr1 length 5 var arr2 howey jim sue jennifer kathy hank ale
  • 从jupyter服务器下载数据

    我通过连接到服务器来使用 ipython 笔记本 我不知道如何以编程方式将内容 例如数据框 csv 文件等 下载到我的本地计算机 因为我无法具体声明路径 如 C user 它将被下载到他们的机器而不是我的机器上 在其中一个笔记本的单独单元格
  • svelte 包应该是依赖项还是 devDependency?

    我知道已经有很多帖子讨论了两者之间的区别dependency and devDependency但我没有找到任何解释 svelte 情况的信息 所以让我们在这里打开这个 在大多数 svelte 包中 比如svelte 材质 ui https
  • 在 VS2012 上禁用 C++11 功能

    是否可以在 VS2012 上禁用 C 11 功能 我的代码还没有准备好 我不想引入进一步的混乱 从 Visual C 2015 Update 3 开始 现在可以为语言行为指定语言版本 显然它不仅仅影响一致性检查 https blogs ms
  • 我应该在 ejs 文件中使用脚本标签吗?

    我正在学习如何开发节点应用程序 这是一个人们可以发布城市周围发生的事件的应用程序 我有一个 ejs 文件 new ejs 它允许用户提交新事件 显然 有一个事件开始时间和结束时间 我想确保结束时间在开始时间之后 所以我简单地添加了一个脚本来
  • 如何从 Maven 的主文件夹访问测试类?

    我创建了一个具有标准文件夹结构的 Maven 项目 i n src main java src test java 等 我写了一个类ClassA和一个测试类TestA 在ClassA的主程序中 我引用了TestA的一个静态成员 代码可以编译
  • 设置数组所有值的最快方法?

    我有一个char 我想将每个索引的值设置为相同char value 有一个明显的方法可以做到这一点 迭代 char f char c new char 50 for int i 0 i lt c length i c i f 但我想知道是否
  • Xamarin.Forms Shell GoToAsync 在 iOS 中无法按预期工作

    我正在使用 Xamarin Forms Shell 功能 我需要从一个选项卡 根 导航到另一个选项卡 第二级 该示例有三个页面 为简单起见 我将其命名为 Page1 Page2 和 Page3 Page1 和 Page2 是 App She
  • 使用 Python unittest 测试回调调用的正确方法是什么?

    我有一个如下所示的应用程序代码 Filename app py class Foo def init self self callback None def set handler self callback self callback c
  • setjmp.h 中定义的 C 语言非本地跳转如何工作?

    The C语言参考手册 附录B描述了两个函数setjmp and longjmp对于所谓的东西非局部跳转 除了基本的了解之外setjmp保存状态信息 longjmp 恢复state 我一直无法理解此功能的确切流程和用例 那么 这个功能到底有