setjmp和longjmp

来源:互联网 发布:域名转让都是骗局吗 编辑:程序博客网 时间:2024/05/18 02:18
使用时包含头文件<setjmp.h>
setjmp()和longjmp()的用途,通过操纵过程活动记录实现转移功能。这两个函数协同工作。
    setjmp(jmp_buf j)必须首先被调用。它表示“使用变量j记录现在的位置。函数返回零”
    longjmp(jmp_buf j,int i)可以接着被调用。表示“回到j所记录的位置,函数返回i,使代码能够知道它是实际上是通过longjmp返回的。”
    当使用longjmp()时,j的内容被销毁。
    setjmp保存了一份程序的计数器和当前的栈顶指针。也可以保存一些初始值。longjmp恢复这些值,有效的转移控制并把状态重置回保存状态的时候。称作“展开堆栈”,因为你从堆栈中展开过程活动记录,直到取得保存在其中的值。
    和goto的区别:
        goto语句不能跳出c语言当前的函数。而longjmp可以跳的更远甚至可以跳到其他文件的函数中。
#include <stdio.h>
#include <setjmp.h>
jmp_buf buf;

banana()
{
        printf("in banana() \n");
        longjmp(buf,1);
        printf("you'|| never see this,because i longjmp'd");
}

int main(void)
{
        if(setjmp(buf))
                printf("back in main\n");
        else
        {
                printf("first time through\n");
                banana();
        }
}
输出:  first time through
        in banana()
        back in main

原创粉丝点击