现在我们来分析上边的代码,在main()函数中,我们最初调用setjmp()函数的时候,把当前的环境信息保存在了buf中,函数返回0,然后往下运行,我们输入0。通过if语句发现b的值为0那么就调用error_code()函数来进行处理,在该函数中我们使用了longjmp()函数,其使用方式为longjmp(buf,1);,通过上面的讲解,我们知道第一个参数的作用是用来得到最初调用setjmp()函数是的环境信息,以便在使用longjmp()函数的时候能够正确的返回到setjmp()函数最初的调用处,而后面的参数表示的返回到setjmp()函数的时候的返回值。我们在此返回1,所以执行else部分的语句。
分析完了上面的代码,读者应该都知道了两个函数的使用方法,值得注意的地方就是我们在setjmp与longjmp结合使用时,它们必须有严格的先后执行顺序,先调用setjmp函数,之后再调用longjmp函数,以恢复到先前被保存的“程序执行点”。否则,假如在setjmp调用之前,执行longjmp函数,将导致程序的执行流变的不可猜测,很轻易导致程序崩溃而退出。为了加深读者的对于两个函数参数的使用,我们看看下面的代码:
|
运行结果为:
|
看看运行结果,我们分析下代码,在每个函数中我们调用longjmp()函数,通过设置第二个参数为不同的值来改变setjmp()函数的返回值,然后我们通过判断value值来打印出是那个函数的返回值,我们在此例举这个简单的代码是要大家加深对于这两个函数的参数的使用情况。如果我们在上面的代码中稍作修改,在setjmp()函数的调用之前调用longjmp()函数,我们发现此时没有任何的输出,程序直接崩溃掉退出了。