setjmp 与 longjmp 的使用

今天在浏览公司代码的时候发现了一个很有意思的函数...setjmp

百度了一下,这个setjmp函数已经使面向过程编程变得扑朔迷离了~

先看代码吧:

#include
#include
#include


jmp_buf b;

void test()
{
    longjmp(b, 1);
}

int main()
{
    if (setjmp(b))
        printf("World!");
    else
    {
        printf("Hello ");
        test();
    }

}

可以猜测下这个程序的输出结果是啥?

很神奇吧~

setjump和longjump定义在setjump.h里:

用于存储环境变量以及信号

jmp_buf

 

存储当前环境以及信号掩码

int setjmp (jmp_buf __env) 

 

恢复setjmp保存的环境变量,并使setjump的返回值为__val, 如果__val == 0, 那么setjmp返回1;

void longjmp (struct __jmp_buf_tag __env[1], int __val)

 

所以继续分析上述代码, 当从main函数开始执行后,setjmp返回0, 于是开始执行else块,调用printf("hello "), 进入test函数执行longjmp, 此时变恢复到setjmp保存的语句块,并返回longjmp的第二个参数1, 于是进入if语句中的printf("world")....

这样setjmp和longjmp的分析便结束了。

其实setjmp和goto语句有点点类似的地方,但是goto语句并不帮我们保存环境,而是直接跳到标签内容。这两种用法都会使程序阅读变得困难一些吧,谨慎使用。

你可能感兴趣的:(程序员的自我修养)