第14章 函数跳转函数库:setjmp.h 在程序中常常需要根据某些条件进行相应的跳转操作,这时就需要用到跳转函数,其中包括非局部转移执行函数和非局部转移函数,这些函数都包含在setjmp.h头文件中。 14.1 longjmp()——非局部转移执行函数 longjmp()函数

    实用程度:★★★★☆

    实例位置:配套资源\SL\14\01

    longjmp()函数用于非局部转移进程,使进程跳转到setjmp处执行。

    语法

    void longjmp(jmp_buf jmp, int retval);

    longjmp()函数的语法参数说明如下:

    参数jmp为jmp_buf结构体,用于保存发生调用出的局部环境。

    参数retval表示此时setjmp的返回值。

    longjmp()函数本身无返回值,它执行后跳转到保存jmp的setjmp()函数的调用,并由setjmp()函数返回1。

    示例

    本示例演示用longjmp()函数进行非局部跳转,执行到longjmp()时,程序跳转到setjmp()函数中进行判断,并输出结果。其具体代码如下:

    img540

    img541

    运行结果如图14.1所示。

    img542

    图14.1 使用longjmp()函数进行非局部跳转 14.2 setjmp()——非局部转移函数 setjmp()函数

    实用程度:★★★★☆

    实例位置:配套资源\SL\14\02

    setjmp()函数用于非局部转移进程,设置缓冲区来保存系统堆栈的内容。

    语法

    int setjmp(jmp_buf jmp);

    setjmp()函数的语法参数说明如下:

    参数jmp为jmp_buf结构体变量,用于保存当前的环境信息。

    setjmp()函数返回两个不同值,当第一次直接调用时返回值为0;当从longjmp()函数返回时,返回值为longjmp()函数的第二个参数的值,即retval值。

    示例

    本示例演示用setjmp()函数将当前系统堆栈信息保存在变量buf中,为longjmp设置跳转点。其具体代码如下:

    img543

    img544

    运行程序,首先setjmp执行返回0,接着调用longjmp,跳转到setjmp并执行返回值为1。执行结果如图14.2所示。

    img545

    图14.2 使用setjmp()函数保存当前系统堆栈信息