在 longjmp
和 setjmp
上的manpage中,有一行:
如果在
longjmp()
之前返回了称为setjmp()
的功能 被称为行为不确定。
这是否意味着我实际上必须在称为setjmp
或嵌套函数中的函数中某个地方调用longjmp
?还是可以完全不称呼它?
你正在读错误。
如果称为setJmp()的函数在调用longjmp()之前返回,则行为是未定义的。
如果您将其称为后,longjmp
的行为是不确定的,则从设置setjmp
的函数返回。但是,完全可以打电话给longjmp
是完全的。
Wikipedia更清晰:
如果称为setJMP返回的函数,则不再有可能安全地使用LongJMP与相应的JMP_BUF对象。
这是因为当功能返回时,堆栈帧无效。调用longJMP还原堆栈指针,因为返回的功能,它将指向不存在且可能覆盖或损坏的堆栈框架。
这些功能通常用于处理异常机制。如果没有发生异常,则不想致电longjmp
,因为没有理由"倒带"您的程序。