setjmp和longjmp函数

setjmp和longjmp函数

在C语言中,不能像其它语言一样使用goto函数跳转。而是使用setjmplongjmp函数代替这类跳转。之后就会看到在深层嵌套中这两个函数处理错误条件是非常有用的。

系统不是必须拥有内建硬件支持的栈,C语言可以使用链表来实现现栈帧的功能。

  #include <setjmp.h>

  int setjmp(jmp_buf env);

Returns: 0 if called directly, nonzero if returning from a call to longjmp

  void longjmp(jmp_buf env, int val);

在想返回的位置调用setjmpsetjmp的参数env是一种特殊的类型jmp_buf。这种类型是当调用longjmp时,它可以恢复所有调用setjmp时的栈状态。一般来说env变量是一个全局变量,因为我们需要在另的函数中引用它。

longjmp有两个参数,第一个env参数和setjmp用的是同一个。第二个val是一个非零值,它会变成setjmp的返回值。第二个参数的作用是用来区分setjmp调用了哪个longjmp

自动变量、寄存器变量和volatile变量

main函数从longjmp函数返回时,其中的自动变量和寄存器变量的值是未知的,有可能回滚,也有可能清除。如果有一个变量的值不想回滚,使用volatile属性定义它。全局变量和静态变量在调用longjmp后会保持不变(left alone)。

某些系统的手册说明,在内存中的变量的值,是当调用longjmp时的值。而在CPU和浮点寄存器中的变量则恢复为调用setjmp时的值。

自动变量的潜在问题

自动变量最基本的一个规则是:不能在函数已经返回后,再去引用该函数中的变量。

发表回复