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

C将函数作为参数传递给函数的方法,c,function,function-pointers,C,Function,Function Pointers,我注意到,似乎有不同的方法将一个函数作为参数传递给另一个函数。原型是: void foo1(double f(double)); 及 这两者有区别吗?它们的实现方式是否相同?还有其他传递函数的方法吗?第二种方法可以说是编写函数的“正确”方法。它说foo1()的参数是指向函数的指针。第一个表示参数是函数,但不能将函数本身作为函数传递,因此编译器将其视为指向函数的指针。因此,在实践中,它们是等价的——在这种情况下。但是,在其他上下文中,您将无法使用double f(double)声明函数指针的符号

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

void foo1(double f(double));


这两者有区别吗?它们的实现方式是否相同?还有其他传递函数的方法吗?

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

ISO/IEC 9899:2011§6.7.6.3功能声明器(包括原型) 8作为“函数返回类型”的参数声明应调整为“指向 功能返回类型”,如6.3.2.1所示

附属问答
请举例说明
double f(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;
boost::函数类型2;
例如:

for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
  print(ctr);
}

void func ( void (*f)(int) ) {
  for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
    (*f)(ctr);
  }
}
for(int-ctr=0;ctr<5;ctr++){
打印(ctr);
}
无效函数(无效(*f)(int)){
对于(int ctr=0;ctr<5;ctr++){
(*f)(中央档案室);
}
}

请举例说明
双f(双)
不起作用?@user968243:只是一个简单的指针定义,
double f(double)=my_double\u func不起作用,但
double(*f)(double)=my\u double\u func会。对于应该首选哪种语法,是否存在某种普遍共识?第一个看起来更可读,但有点误导,而第二个写起来更麻烦,但却清楚地反映了正在发生的事情。正如您所说,它是显式的,在任何地方都能正确工作,而第一个符号只能在函数参数列表中使用。
void dosomething() { }

functiontype func = &dosomething;
func();
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);
  }
}