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