我需要确保我首先了解一些基本的东西:
- 如何将函数 A 作为参数传递给函数 B?
- 我如何从 B 内部调用函数 A ?
现在来看看重头戏:
我正在尝试按照以下方式做一些事情:
jmp_buf buf;
buf.__jmpbuf[JB_PC] = functionA;
longjmp(buf,10);
这意味着我想使用longjmp
它来执行某个功能。我该怎么做?
我需要确保我首先了解一些基本的东西:
现在来看看重头戏:
我正在尝试按照以下方式做一些事情:
jmp_buf buf;
buf.__jmpbuf[JB_PC] = functionA;
longjmp(buf,10);
这意味着我想使用longjmp
它来执行某个功能。我该怎么做?
您需要使用指向函数的指针。声明函数指针的语法是:
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 必须能够按值获取并修改它),但除此之外,setjmp.h 的规范没有定义jmp_buf 的结构。因此,任何试图直接操纵 jmp_buf 的东西都将特定于特定平台。
将 functionA 作为参数传递给 functionB:
typedef void function_type(void);
void functionA(void) { printf("这是函数 A\n"); }
int main(int argc, char **argv) { functionB(&functionA); 返回(0);}
从函数 B 调用函数 A:
无效函数B(function_type *func) { func(); }
用于longjmp()
转到功能。最好的答案是“不要这样做”——几乎总是有更好的方法来实现相同的目标。你能解释一下你需要这个的情况吗?