在C语言中没有直接提供类似Python或Java等语言中的异常处理机制(try... catch ...)。但是它的标准库中有两个非常有用的函数setjmp 和longjmp ,它们在处理异常上面的非常有用。这两个函数的作用有点类似goto语句。但是我们不能使用 goto 语句来实现跨函数的跳转;幸运的是,setjmp 和longjmp却能完成这种类型的跳转——它们是C语言中非常奇特的两个存在。
一、背景介绍
回想一下C语言中的goto语句。如果读者有点不记得了,下面引用《C语言参悟之旅》中的一些内容。
一个函数执行结束后,函数的context会被从函数调用栈中弹出,所以在函数返回后仍然保留相应的“语句标号”就成为了问题的关键。函数的context包括以下内容:
- 函数栈帧,主要是栈帧指针BP和栈顶指针SP
- 程序指针PC,此处为指向 Label 语句的地址
- 其它寄存器,这是和体系相关的&#