我需要先确定一些基本的东西:
现在是大战:
我正在尝试按照以下方式做点什么:
jmp_buf buf;
buf.__jmpbuf[JB_PC] = functionA;
longjmp(buf,10);
这意味着我想使用longjmp
来转到函数。我该怎么办?
答案 0 :(得分:3)
您需要使用指向函数的指针。声明函数指针的语法是:
rettype (*)(paramtype1,paramtype2,...,paramtypeN)
因此,例如,我们可能会有以下代码:
char functionA(int x)
{
printf("%d\n",x):
return 'a';
}
char functionB(char (*f)(int), int val)
{
return f(val); // invokes the function pointer
}
int main(int argc, char* argv[])
{
char result = functionB(&functionA,3); // prints "3"
printf("%c\n",result); // prints 'a'
return 0;
}
另外,请注意,虽然& functionA取得了functionA的地址,但实际上没有必要在那里使用&符号......我个人这样做,因为我觉得它更清楚它是一个功能指针。使用与调用函数时相同的语法调用函数指针。
至于使用跳转缓冲区,我相信你所做的不是可以依赖的东西。如果你想在调用某个函数之前创建一个跳转缓冲区并调用setjmp,那么稍后调用longjmp以便在调用之前立即返回,然后定义良好。但是,jmp_buf的实际定义和结构是特定于实现的。它必须满足某些要求(例如,它必须是一个数组类型,因为setjmp必须能够按值获取并修改它),但除此之外,specification for setjmp.h没有定义jmp_buf的结构。因此,任何试图直接操作jmp_buf的东西都将特定于特定平台。
答案 1 :(得分:0)
将functionA作为参数传递给functionB:
typedef void function_type(void);
void functionA(void) { printf(“这是函数A \ n”); }
int main(int argc,char ** argv) { functionB(安培;泛函); return(0); }
从功能B调用功能A:
void functionB(function_type * func) { FUNC(); }
使用longjmp()
转到某个功能。最好的答案是“不要这样做” - 几乎总有一种更好的方法来实现同样的目标。你能解释一下你需要的情况吗?