在'setjmp'之后我是否必须调用'longjmp'

问题描述 投票:7回答:1

longjmpsetjmp的联机帮助页中,有这一行:

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

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

c setjmp
1个回答
11
投票

你读错了。

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

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

Wikipedia更清楚:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.