假设我想用纯C实现数字积分例程。它将看起来像这样:
double integrate(double (*f)(double), double lower, double upper, double step));
我经常发现实际上依赖于多个变量的函数,并且我想在第一个变量上进行集成。说我想整合这个:
double func(double x, double z);
关于x
。我无法通过func
,integrate
因为它的签名错误。现在,我知道以下变通方法,当我们修读数字课程时,我们采用了以下变通方法:
使用C ++
我只是使用C ++和iststd::bind
来创建可以传递给集成例程的函子(函数对象)。现在,我只需要使用lambda函数来完成它。
使用GCC扩展功能
使用GCC,您可以在函数中声明一个函数。所以一个人可以做
// z is set to some value in this function scope here.
double inner(double x) {
return func(x, z);
}
并将其传递inner
给integrate
函数。那是非标准的,感觉不太好。
使用全局变量
的值z
可以存储在全局变量中。这将要求该函数func
是可编辑的,以便z
从全局变量而不是参数中使用。那可能是不可能的。然后,它也破坏了并发性,并且通常是不好的。
在纯C中是否存在不破坏某些内容的方法?
解决此问题的一种常见方法是将设计更改为:
double integrate(double (*f)(double, void*), void*,
double lower, double upper, double step);
在这里,您将附加传递void *
给integrate
,并将其传递回f
。这可以用来传递任意数据,在这种情况下,您将传递一个指针z
,在函数内,f
您将把指针强制转换回其原始类型并恢复该值z
。这种模式在C库中无处不在,例如,这是pthread_create的原型:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句