C语言:写个setjmp相关的小程序,百度百科的看不懂
#include<setjmp.h>//相信有经验的高手肯定能写出个更容易让人了解setjmp的短程序(附解释哦)...
#include<setjmp.h>
//相信有经验的高手肯定能写出个更容易让人了解setjmp的短程序(附解释哦) 展开
//相信有经验的高手肯定能写出个更容易让人了解setjmp的短程序(附解释哦) 展开
2个回答
展开全部
#这是APUE 7.10节的例子,很好懂
#详细的参考原书吧,有对结果的详细分析,讲的肯定比我说的透彻
#include "apue.h"
#include <setjmp.h>
static void f1(int, int, int, int);
static void f2(void);
static jmp_buf jmpbuffer;
static int globval;
int
main(void)
{
int autoval;
register int regival;
volatile int volaval;
static int statval;
globval = 1; autoval = 2; regival = 3; volaval = 4; statval = 5;
if (setjmp(jmpbuffer) != 0) {
printf("after longjmp:\n");
printf("globval = %d, autoval = %d, regival = %d,"
" volaval = %d, statval = %d\n",
globval, autoval, regival, volaval, statval);
exit(0);
}
/*
* Change variables after setjmp, but before longjmp.
*/
globval = 95; autoval = 96; regival = 97; volaval = 98;
statval = 99;
f1(autoval, regival, volaval, statval); /* never returns */
exit(0);
}
static void
f1(int i, int j, int k, int l)
{
printf("in f1():\n");
printf("globval = %d, autoval = %d, regival = %d,"
" volaval = %d, statval = %d\n", globval, i, j, k, l);
f2();
}
static void
f2(void)
{
longjmp(jmpbuffer, 1);
}
追问
longjmp(jmpbuffer, 1); 这句什么意思?
追答
这句意思就是返回setjmp那一点,参数 1 是返回给setjmp的值,用来标识是第一次调用setjmp设置跳转点(此时setjmp返回0)还是从longjmp返回的(此时setjmp返回longjmp的第二个参数)。
总体的思路就是:
1 程序开始直接调用setjmp设置一个返回点,函数返回值为0,它的参数是一个jmp_buf结构的变量env,存储用于恢复函数堆栈状态的信息;
2 在程序运行过程中,出现了你想返回到setjmp设置的那个返回点的时候,调用longjmp(env, val),env就是步骤1中使用的jmp_buf结构,val是个int,用来作为setjmp的返回值。
3 在setjmp调用的地方,要对其返回值判断,如果是0,则是设置返回点,如果非0,说明是从特定的longjmp处返回,这个返回值可以有多个,说明一个setjmp可以对应多个longjmp,就是可以从多个点返回到setjmp处。
另外,上面APUE的例子,是为了说明使用setjmp/longjmp时,不同的编译器优化选项对返回时函数栈状态的影响。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询