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

我想创build一个函数,执行一个数据传递参数的函数。 你如何在C中传递一个函数作为参数?

宣言

一个函数的原型采用函数参数如下所示:

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

这表明参数f将是一个指向具有void返回types的函数的指针,并且该参数只接受一个int参数。 下面的函数( print )是一个可以作为parameter passing给func的函数的例子,因为它是正确的types:

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

函数调用

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

 func(print); 

将调用func ,将打印function传递给它。

function体

与任何参数一样,func现在可以在函数体中使用该参数的名称来访问参数的值。 假设func将把它传递给数字0-4的函数应用。 首先考虑一下这个循环看起来像直接调用打印:

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

由于func的参数声明说f是指向所需函数的指针的名字,所以我们首先回想一下,如果f是一个指针,那么*f就是f指向的东西(即在这种情况下print的函数)。 因此,只需用*freplace上面的循环中的每一处打印;

 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

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

 typedef void (*functiontype)(); 

声明一个返回void且不带参数的函数。 要创build一个这种types的函数指针,现在可以这样做:

 void dosomething() { } functiontype func = &dosomething; func(); 

对于一个函数,返回一个int,并采取一个字符,你会做的

 typedef int (*functiontype2)(char); 

并使用它

 int dosomethingwithchar(char a) { return 1; } functiontype2 func2 = &dosomethingwithchar int result = func2('a'); 

有一些库可以帮助把函数指针转换成可读的types。 助推函数库是伟大的,是非常值得的努力!

 boost::function<int (char a)> functiontype2; 

比上面好多了。

从C ++ 11开始,您可以使用函数库以简洁通用的方式进行操作。 语法是,例如,

 std::function<bool (int)> 

其中bool是第一个参数types为int的单参数函数的返回types。

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

 // 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); } 

将一个函数的地址作为parameter passing给另一个函数 ,如下所示

 #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(); } 

你需要传递一个函数指针 。 这个语法有点麻烦,但是一旦你熟悉它,它确实很强大。