你如何在C中传递一个函数作为参数?

wfuga 发布于 2018-03-29 c 最后更新 2018-03-29 11:10 476 浏览

我想创建一个函数,该函数执行一组数据上通过参数传递的函数。你如何在C中传递一个函数作为参数?

已邀请:

tiste

赞同来自:

您需要传递function pointer。这个语法有点麻烦,但是一旦你熟悉它,它的确很强大。

ut_quo

赞同来自:

声明 采用函数参数的函数的原型如下所示:

void func ( void (*f)(int) );
这表明参数f将是一个指向具有void返回类型的函数的指针,并且该参数将采用单个int参数。以下函数(print)是可以作为参数传递给func的函数的一个示例,因为它是正确的类型:
void print ( int x ) {
  printf("%d\n", x);
}
功能呼叫 当使用函数参数调用函数时,传递的值必须是指向函数的指针。使用该函数的名称(不带圆括号):
func(print);
会调用func,将打印功能传递给它。 功能体 与任何参数一样,func现在可以在函数体中使用该参数的名称来访问该参数的值。假设func将把它传递给数字0-4的函数应用。首先考虑一下这个循环看起来像直接调用print:
for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
  print(ctr);
}
由于func的参数声明指出f是指向所需函数的指针的名称,因此我们首先回顾如果f是指针,则*ff指向的那个(即在这种情况下为函数print)。因此,只需使用*f替换上面循环中每次出现的打印:
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

ut_sed

赞同来自:

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

typedef void (*functiontype)();
声明一个返回void且不带参数的函数。要创建一个这种类型的函数指针,你现在可以这样做:
void dosomething() { }
functiontype func = &dosomething;
func();
对于一个函数,返回一个int并采取一个字符,你会做的
typedef int (*functiontype2)(char);
并使用它
int dosomethingwithchar(char a) { return 1; }
functiontype2 func2 = &dosomethingwithchar
int result = func2('a');
有些库可以帮助将函数指针转换为可读的类型。 boost function图书馆非常棒,非常值得您付出努力!
boost::function<int (char a)> functiontype2;
比上面好得多。

peum

赞同来自:

自C++ 11以来,您可以使用functional library以简洁通用的方式完成此操作。语法是,例如,

std::function<bool (int)>
bool是第一个参数类型为int的单参数函数的返回类型。 我在下面列出了一个示例程序:
// g++ test.cpp --std=c++11
#include <functional>
double Combiner(double a, double b, std::function<double (double,double)> 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<class T>
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);
}

snihil

赞同来自:

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

#include <stdio.h>
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 <stdio.h>
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();
}