【发布时间】:2017-12-23 20:47:19
【问题描述】:
在longjmp 和setjmp 的手册页中,有这样一行:
如果调用
setjmp()的函数在longjmp()之前返回是 调用,行为未定义。
这是否意味着我实际上必须在调用setjmp 的函数或嵌套函数中的某处调用longjmp?或者根本不调用它可以吗?
【问题讨论】:
在longjmp 和setjmp 的手册页中,有这样一行:
如果调用
setjmp()的函数在longjmp()之前返回是 调用,行为未定义。
这是否意味着我实际上必须在调用setjmp 的函数或嵌套函数中的某处调用longjmp?或者根本不调用它可以吗?
【问题讨论】:
你读错了。
如果调用 setjmp() 的函数在调用 longjmp() 之前返回,则行为未定义。
如果您在从设置setjmp 的函数返回后调用它,则longjmp 的行为是未定义的。但是完全可以不打电话给longjmp。
Wikipedia 更清晰:
如果调用 setjmp 的函数返回,则不再可能安全地使用 longjmp 和相应的 jmp_buf 对象。
这是因为函数返回时栈帧无效。调用 longjmp 会恢复堆栈指针,因为返回的函数将指向一个不存在且可能被覆盖或损坏的堆栈帧。
这些函数通常用于处理异常机制。如果没有发生异常,您不想调用longjmp,因为没有理由“倒带”您的程序。
【讨论】: