虽然 C 是我一开始学的语言,距离大学刚学 C 都快七年了,今天才知道还有 jmp_buf, setjmp, longjmp 这个。它们主要用来实现抛出异常。
macOS 10.12 usr/include/setjmp.h
以上就是我系统的 setjmp.h
,里面定义了 jmp_buf
,至于 setjmp
跟 longjmp
的定义,在系统里面并没有找到,然后我搜了一下 linux 的源代码,会发现它们是用汇编定义了的。我理解了一下 wiki,大概 setjmp 调用时(返回 0,表示保存成功),记录了当前运行环境到一个 jmp_buf 参数;然后你可以在某些情况下用这个 jmp_buf 变量来调用 longjmp,来复原到 setjmp 的现场(个人理解是返回到 setjmp 返回值之前的时候),通过设置 longjmp 的第二个参数改变了当时 setjmp 的返回值,通过这样来改变 setjmp 之后的行为。