我注意到似乎有不同的方法可以将函数作为参数传递给另一个函数。原型是:
void foo1(double f(double));
和
void foo2(double (*f)(double));
两者有区别吗?它们是否以相同的方式实施?还有其他传递函数的方法吗?
我注意到似乎有不同的方法可以将函数作为参数传递给另一个函数。原型是:
void foo1(double f(double));
和
void foo2(double (*f)(double));
两者有区别吗?它们是否以相同的方式实施?还有其他传递函数的方法吗?
第二个可以说是编写它的“正确”方式。它说 to 的参数foo1()
是一个指向函数的指针。第一个表示参数是一个函数,但您不能将函数作为函数本身传递,因此编译器将其视为指向函数的指针。因此,在实践中,它们是等价的——在这种情况下。但是,在其他情况下,您将无法使用该double f(double);
符号来声明指向函数的指针。
ISO/IEC 9899:2011 §6.7.6.3 函数声明符(包括原型)
¶8 将参数声明为“函数返回类型”应调整为“指向函数返回类型的指针”,如 6.3.2.1 中所示。
你能举一个
double f(double);
不工作的例子吗?
#include <math.h>
double (*pointer)(double) = sin;
double function(double); // This declares the existence of 'function()'
这是在文件范围内;它也可以在代码块中,例如在函数内部。指向函数符号的指针按您的意愿工作。普通函数只是声明一个函数——而不是包含指向函数的指针的变量。
符号(松散)等效的唯一地方是函数参数列表中:
声明:
double integrate(double lo, double hi, double (*function)(double));
double differentiate(double lo, double hi, double function(double));
定义:
double integrate(double lo, double hi, double (*function)(double))
{
...
}
double differentiate(double lo, double hi, double function(double))
{
...
}
函数或函数指针参数可以在这些声明和定义中互换使用,但只能在参数列表中使用——不能在函数体中使用。
因为显式“函数指针”表示法在任何地方都有效,而其他表示法只能在非常有限的一组地方工作,所以您通常应该使用显式“函数指针”表示法,即使它有点冗长。
两种方法都声明了相同的参数类型。两者之间没有任何区别。函数类型的参数隐式调整为指向函数类型的指针,这意味着编译器将第一个声明解释为与第二个声明等效。这是个人喜好的问题,您想在代码中使用哪一个。
将函数作为参数传递给函数的语法
typedef void (*functiontype)();
声明一个函数
void dosomething() { }
functiontype func = &dosomething;
func();
这些库可以帮助将函数指针转换为可读的类型。boost 函数库很棒,值得努力!
boost::function<int (char a)> functiontype2;
例子:
for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
print(ctr);
}
void func ( void (*f)(int) ) {
for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
(*f)(ctr);
}
}