3

我需要确保我首先了解一些基本的东西:

  1. 如何将函数 A 作为参数传递给函数 B?
  2. 我如何从 B 内部调用函数 A ?

现在来看看重头戏:

我正在尝试按照以下方式做一些事情:

jmp_buf buf;
buf.__jmpbuf[JB_PC] = functionA;
longjmp(buf,10);

这意味着我想使用longjmp它来执行某个功能。我该怎么做?

4

2 回答 2

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 必须能够按值获取并修改它),但除此之外,setjmp.h 的规范没有定义jmp_buf 的结构。因此,任何试图直接操纵 jmp_buf 的东西都将特定于特定平台。

于 2010-05-18T09:09:46.970 回答
0
  1. 将 functionA 作为参数传递给 functionB:

    typedef void function_type(void);

    void functionA(void) { printf("这是函数 A\n"); }

    int main(int argc, char **argv) { functionB(&functionA); 返回(0);}

  2. 从函数 B 调用函数 A:

    无效函数B(function_type *func) { func(); }

  3. 用于longjmp()转到功能。最好的答案是“不要这样做”——几乎总是有更好的方法来实现相同的目标。你能解释一下你需要这个的情况吗?

于 2010-05-18T09:15:04.517 回答