你能在 C 中拥有带指定参数值的函数指针吗?

标签 c function-pointers

我想指向类似add(2, 1) 的东西,然后调用它而不需要指定参数。有什么方法可以用函数指针做到这一点吗?

最佳答案

作为对您问题的评论,Basile Starynkevitch建议阅读 closures .闭包的核心是将要调用的函数与某些上下文结合在一起,在文献中称为函数的环境

面向对象语言有一个类似的概念,称为 delegates特定实例可以成为稍后调用的环境,其中调用站点不直接了解底层对象。 native 支持闭包的语言会自动捕获或“关闭”环境中提供的绑定(bind)。它可能看起来是一种奇怪的语言特征,但正如您问题背后的动机所暗示的那样,它可以是富有表现力和有用的。

下面是 C 程序中闭包概念的一个简单示例,其中由程序员明确指示捕获。

你想要最终调用的函数加上一些前面的内容是

#include <stdio.h>

int
add_two_numbers(int a, int b)
{
  return a+b;
}

闭包是一个结合其环境调用的函数。在 C 中,要调用的函数是一个指向函数的指针。请注意,f 的参数与 add_two_numbers 的参数对齐。

typedef struct {
  struct {  /* environment */
    int a;
    int b;
  } env;

  int (*f)(int, int);  /* function to be called */
} closure;

我们想创建一个闭包,,设置参数值的关联,以便在我们准备好时与要调用的函数一起传递。在这个简单的示例中,make_adder 将为闭包分配空间的问题留给了它的调用者。

void
make_adder(int a, int b, closure *c)
{
  c->env.a = a;
  c->env.b = b;
  c->f = add_two_numbers;
}

现在您已经知道如何创建我们的一个简单闭包,您可以调用或调用

int invoke_closure(closure *c)
{
  return c->f(c->env.a, c->env.b);
}

最后,用法看起来像

int main(void)
{
  closure c;
  make_adder(2, 1, &c);

  printf("The answer is %d.\n", invoke_closure(&c));

  return 0;
}

输出为

The answer is 3.

进一步阅读

关于你能在 C 中拥有带指定参数值的函数指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49325357/

相关文章:

c++ - C/C++ 中的固定长度数据类型

c - 指向表的数组和表元素上的双指针

c++ - 宏参数列表中的指针

c++ - 如何在 C++ 中创建一个包含不同类型函数指针的容器?

c - 数组作为带参数的函数?

c - 如何在同一个C程序中监听套接字并连接到不同的套接字(相同的IP地址但不同的端口号)

c - 使用链表进行堆排序

c++ - 编写此指针函数代码的长格式是什么?

c - 这段打印 1 到 1000 的代码在 C 中如何工作?

c - 为什么我可以通过带有太多参数的指针来调用函数?