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

Mic*_*ail 8 c setjmp

在该手册页longjmpsetjmp,有这样一行:

如果调用setjmp()之前longjmp()调用的函数被调用,则行为未定义.

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

Jea*_*bre 12

你读错了.

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

longjmp如果从设置的函数返回调用它,则行为是未定义的setjmp.但是根本打电话完全没问题longjmp.

维基百科更清晰:

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

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

这些函数通常用于处理异常机制.如果没有发生异常,您不想打电话,longjmp因为没有理由"倒回"您的程序.