我想指向类似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/