我想使用setjmp/longjmp来重用主函数中的一些代码(注意:这只是一个练习,而不是我在现实世界中认真计划要做的事情)。下面的代码是我想出的:
#include <stdio.h>
#include <setjmp.h>
jmp_buf jmp_body, jmp_ret;
void func(void)
{
if (setjmp(jmp_ret) == 0)
longjmp(jmp_body, 1);
}
int main()
{
int x = 0;
if (setjmp(jmp_body) == 1) {
printf("Body %d\n", ++x);
longjmp(jmp_ret, 1);
}
func();
func();
func();
return 0;
}我预期此代码的工作方式如下:
main()函数将记住“body”部分的位置,并使用if (setjmp(jmp_body) == 1)跳过它。func()调用将在记住身体应该使用if (setjmp(jmp_ret) == 0)返回的位置之后,使用if (setjmp(jmp_ret) == 0)临时跳转到身体。func()执行并跳转回longjmp(jmp_ret, 1)调用。func()将像预期的那样返回到main()。因此,我期望代码打印如下:
Body 1
Body 2
Body 3相反,它会永远地循环不断地执行主体,这意味着func()调用没有返回它应该返回的地方,而是可能在自身之上返回,一次又一次地执行自己。
相比之下,下面的代码打印的正是我所期望的:
#include <stdio.h>
#include <setjmp.h>
jmp_buf jmp_body, jmp_ret;
int main()
{
int x = 0;
if (setjmp(jmp_body) == 1) {
printf("Body %d\n", ++x);
longjmp(jmp_ret, 1);
}
if (setjmp(jmp_ret) == 0)
longjmp(jmp_body, 1);
if (setjmp(jmp_ret) == 0)
longjmp(jmp_body, 1);
if (setjmp(jmp_ret) == 0)
longjmp(jmp_body, 1);
return 0;
}如何将if (setjmp(jmp_ret) == 0) longjmp(jmp_body, 1)放入函数调用中,从而使原始方法无效?
发布于 2021-07-15 14:15:04
您尝试将longjmp从main()还原到func()。这是没有定义的。因为longjmp本身就是一个函数,所以您很可能以longjmp进入func,返回地址是longjmp调用本身,因此是一个无限循环。
https://stackoverflow.com/questions/68395378
复制相似问题