提问



我想创建一个函数来执行由一组数据上的参数传递的函数。如何在C中将函数作为参数传递?

最佳参考


声明


带函数参数的函数原型如下所示:


void func ( void (*f)(int) );


这表明参数f将是一个指向函数的指针,该函数具有void返回类型并且采用单个int参数。以下函数(print)是一个函数的示例,可以作为参数传递给func,因为它是正确的类型:


void print ( int x ) {
  printf("%d\n", x);
}


功能调用


使用函数参数调用函数时,传递的值必须是指向函数的指针。使用函数的名称(不带括号):


func(print);


会调用func,将打印功能传递给它。


功能正文


与任何参数一样,func现在可以使用函数体中的参数s来访问参数的值。让我们说func将应用它传递给数字0-4的函数。首先考虑一下直接调用print的循环:


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


由于func的参数声明说f是指向所需函数的指针的名称,我们首先回想一下,如果f是一个指针,那么*f就是这个东西f指向(即本例中的函数print。)因此,只需用*f替换上面循环中每次出现的print:


void func ( void (*f)(int) ) {
  for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
    (*f)(ctr);
  }
}


来自http://math.hws.edu/bridgeman/courses/331/f05/handouts/c-c++-notes.html [31]

其它参考1


这个问题已经有了定义函数指针的答案,但是它们会变得非常混乱,特别是如果你要在应用程序中传递它们。为了避免这种不愉快,我建议你将函数指针键入为更可读的东西。例如。


typedef void (*functiontype)();


声明一个返回void并且不带参数的函数。要创建指向此类型的函数指针,您现在可以执行以下操作:


void dosomething() { }

functiontype func = &dosomething;
func();


对于返回int并获取char的函数,您可以这样做


typedef int (*functiontype2)(char);


并使用它


int dosomethingwithchar(char a) { return 1; }

functiontype2 func2 = &dosomethingwithchar
int result = func2('a');


有些库可以帮助将函数指针转换为可读的类型。 boost函数库很棒,值得付出努力![32]


boost::function functiontype2;


比上面好多了。

其它参考2


从C ++ 11开始,您可以使用函数库以简洁和通用的方式完成此操作。语法是,例如,[33]


std::function


其中bool是一个参数的返回类型,其第一个参数的类型为int


我在下面列出了一个示例程序:


// g++ test.cpp --std=c++11
#include 

double Combiner(double a, double b, std::function func){
  return func(a,b);
}

double Add(double a, double b){
  return a+b;
}

double Mult(double a, double b){
  return a*b;
}

int main(){
  Combiner(12,13,Add);
  Combiner(12,13,Mult);
}


但有时候,使用模板功能会更方便:


// g++ test.cpp --std=c++11

template
double Combiner(double a, double b, T func){
  return func(a,b);
}

double Add(double a, double b){
  return a+b;
}

double Mult(double a, double b){
  return a*b;
}

int main(){
  Combiner(12,13,Add);
  Combiner(12,13,Mult);
}

其它参考3


函数的地址作为参数传递给另一个函数,如下所示


#include 

void print();
void execute(void());

int main()
{
    execute(print); // sends address of print
    return 0;
}

void print()
{
    printf("Hello!");
}

void execute(void f()) // receive address of print
{
    f();
}


我们也可以使用函数指针将函数作为参数传递


#include 

void print();
void execute(void (*f)());

int main()
{
    execute(&print); // sends address of print
    return 0;
}

void print()
{
    printf("Hello!");
}

void execute(void (*f)()) // receive address of print
{
    f();
}

其它参考4


你需要传递一个函数指针。语法有点麻烦,但一旦你熟悉它就会非常强大。[34]