作者回复: 除了我们在文章中提到的可以用来实现 try...catch,协程以外,也可以用在信号处理程序中。比如参考这边的例子:https://www.gnu.org/software/libc/manual/html_node/Longjmp-in-Handler.html。除此之外,我好像没有再见到过其他用例。其他同学如果有另外的使用场景也可以补充哈。
作者回复: 没错的哈。
作者回复: 因为 rbx 属于 callee-saved 寄存器,需要由被调用方保存状态,并在结束前重置。
作者回复: 是这个:https://godbolt.org/
作者回复: setjmp 初次调用会返回 0,而后续 longjmp 在每次返回到 setjmp 时都会携带更新后的值。
作者回复: setjmp 调用时传递的 jb 是一个指针哈。jb 对应的类型 jmp_buf 是这样定义的:typedef long jmp_buf[8];
作者回复: va_start 在调用时的第二个参数,需要传入函数参数列表中显式定义的最后一个带名字的参数,这个是必须要传的。
作者回复: setjmp 和 longjmp 是在 C 语言中实现协程这种语言特性的一种方式,但其他语言比如 Python、JavaScript 中的 yield 关键字是怎样实现的,这个就要具体情况具体分析了。当然,在 C 中也可以实现 yield,比如参考这个 Post:https://stackoverflow.com/questions/17478264/implementing-yield-in-c
作者回复: 思路是对的,不过可以用宏封装一下,让使用方式更自然一些。可以参考这篇文章:http://groups.di.unipi.it/~nids/docs/longjump_try_trow_catch.html