C方法将函数作为参数传递给函数

时间:2013-09-07 04:52:55

标签: c function function-pointers

我注意到似乎有不同的方法将函数作为参数传递给另一个函数。原型是:

void foo1(double f(double));

void foo2(double (*f)(double));

这两者有区别吗?他们是以同样的方式实施的吗?有没有其他方法可以传递函数?

3 个答案:

答案 0 :(得分:6)

第二种可以说是写“正确”的方式。它说foo1()的参数是指向函数的指针。第一个说参数是一个函数,但你不能将函数本身作为函数传递,因此编译器将其视为函数的指针。所以,在实践中,它们是等价的 - 在这种情况下。但是,在其他情况下,您将无法使用double f(double);表示法来声明指向函数的指针。

  

ISO / IEC 9899:2011§6.7.6.3函数声明符(包括原型)

     

¶8参数声明为“函数返回 type ”应调整为“指向   函数返回 type “,如6.3.2.1。

附属问答

  

请举例说明double f(double);不起作用?

#include <math.h>

double (*pointer)(double) = sin;
double function(double);   // This declares the existence of 'function()'

这是在档案范围;它也可以在代码块中,例如在函数内部。指向函数表示法的指针可以按预期工作。 plain函数只是声明一个函数 - 不是包含函数指针的变量。

符号(松散地)等效的唯一地方是函数参数列表:

声明:

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))
{
    ...
}

函数或函数指针参数可以在这些声明和定义中互换使用,但只能在参数列表中使用 - 而不是在函数体中。

因为显式的“指向函数的指针”符号在任何地方都有效,而另一种符号只能在一组非常有限的地方工作,所以你通常应该使用显式的“指向函数的指针”表示法,即使它更加冗长。

答案 1 :(得分:4)

两种方法都声明了相同的参数类型。两者之间没有任何区别。函数类型的参数被隐式调整为指向函数类型,这意味着编译器将第一个声明解释为等效于第二个声明。这是个人偏好的问题,您希望在代码中使用哪一个。

答案 2 :(得分:0)

将函数作为参数传递给函数

的语法
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);
  }
}