gpt4 book ai didi

c - 如何制作一个返回函数的函数?

转载 作者:太空狗 更新时间:2023-10-29 16:20:14 24 4
gpt4 key购买 nike

大图:我有一个包含函数的模块和一个包含基于这些函数的过程和函数的模块。

当我组合两个函数时(来自函数的模块接口(interface)):

double f1(double alpha, double x);
double f2(double beta, double x);

有几种方式,(其中一种是添加):

double OP_Addition(double (*f)(double,double) , double (*g)(double,double), double param1, double param2, double x);

以下(部分)实现没有问题:

z1 = (*f)(param1, x);
z2 = (*g)(param2, x);
y = z1 + z2;
return y;

但是当我想返回一个指向"new"函数的指针时,像这样:

void *OP_PAdd( double (*f)(double,double), double param3 );

我无法让它正常工作,也无法做出正确的“调用”。我想使用输出“函数”作为其他函数的输入。

最佳答案

当从另一个函数返回一个函数时,最简洁的方法是使用 typedef:

typedef double (*ftype)(double, double);

然后你可以这样声明你的函数:

ftype OP_PAdd( ftype f, double param3 )
{
....
return f1;
}

你可以在没有 typedef 的情况下做到这一点,但它很困惑:

double (*OP_PAdd( double (*f)(double,double), double param3 ))(double,double)
{
return f1;
}

因此,当您将函数指针作为参数或其他函数的返回值时,请使用 typedef

编辑:

虽然您可以这样声明类型:

typedef double ftype(double, double);

在实践中你永远不能直接使用这样的类型。函数不能返回函数(只能是指向函数的指针),也不能给这种类型的变量赋值。

此外,您不需要显式取消引用函数指针来调用该函数,因此指针本身是隐藏的这一事实并不是什么大问题。将函数指针定义为 typedef 也是惯例。来自man page for signal :

   #include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

关于c - 如何制作一个返回函数的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37767634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com