【问题标题】:Do I have to call 'longjmp' after a 'setjmp'我必须在“setjmp”之后调用“longjmp”吗
【发布时间】:2017-12-23 20:47:19
【问题描述】:

longjmpsetjmp 的手册页中,有这样一行:

如果调用setjmp()的函数在longjmp()之前返回是 调用,行为未定义。

这是否意味着我实际上必须在调用setjmp 的函数或嵌套函数中的某处调用longjmp?或者根本不调用它可以吗?

【问题讨论】:

    标签: c setjmp


    【解决方案1】:

    你读错了。

    如果调用 setjmp() 的函数在调用 longjmp() 之前返回,则行为未定义。

    如果您在从设置setjmp 的函数返回后调用它,则longjmp 的行为是未定义的。但是完全可以打电话给longjmp

    Wikipedia 更清晰:

    如果调用 setjmp 的函数返回,则不再可能安全地使用 longjmp 和相应的 jmp_buf 对象。

    这是因为函数返回时栈帧无效。调用 longjmp 会恢复堆栈指针,因为返回的函数将指向一个不存在且可能被覆盖或损坏的堆栈帧。

    这些函数通常用于处理异常机制。如果没有发生异常,您不想调用longjmp,因为没有理由“倒带”您的程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 2020-08-21
      相关资源
      最近更新 更多