longjmp -- 1




综述在C语言中,goto语句是不能跨越函数的,而执行这类功能的函数就是 setjmp 和 longjmp,这两个函数对于处理深层嵌套调用中的出错情况是非常有用的比如一个程序中main函数循环调用fgets读取,然后用do_line函数循环处理读到的每一行,在do_line函数中再循环调用cmd_add,在cmd_add函数中又循环调用get_line函数,这样的程序中,如果在某一层遇到错误返回,又不想停止处理,只是想跳过当前行继续执行,正常情况下,需要根据每个函数的返回值判断之后逐层返回,这是非常麻烦的解决这样问题的方法就是用setjmp和longjmp函数 setjmp、longjmpint setjmp (jmp_buf env); 定义于 setjmp.h头文件中,若直接调用返回0,若从longjmp调用返回longjmp函数的第二个参数 void longjmp (jmp_buf env, int val); 定义于setjmp.h头文件中,第二个参数为非0值,用于返回给setjmp函数处理 jmp_buf是一个数组,用于存储用来恢复栈状态的所有信息,因为要在另一个函数中引用env,所以规范的做法是将env变量定义为全局变量。 e.g./* * file: jmp.c *
#读书笔记    #技术帖    #linux    #unix   



京ICP备15018585号