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


当前回答

它不是一个真正的函数,但它是一段本地化的代码。当然,它不传递代码,只传递结果。如果将它传递给事件分派器以便稍后运行(因为结果是现在计算的,而不是事件发生时计算的),则它将不起作用。但是如果这就是你想要做的,它会把你的代码本地化到一个地方。

#include <stdio.h>

int IncMultInt(int a, int b)
{
    a++;
    return a * b;
}

int main(int argc, char *argv[])

{
    int a = 5;
    int b = 7;

    printf("%d * %d = %d\n", a, b, IncMultInt(a, b));

    b = 9;

    // Create some local code with it's own local variable
    printf("%d * %d = %d\n", a, b,  ( { int _a = a+1; _a * b; } ) );

    return 0;
}

其他回答

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

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函数库是伟大的,是非常值得的努力!

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

比上面的好多了。

它不是一个真正的函数,但它是一段本地化的代码。当然,它不传递代码,只传递结果。如果将它传递给事件分派器以便稍后运行(因为结果是现在计算的,而不是事件发生时计算的),则它将不起作用。但是如果这就是你想要做的,它会把你的代码本地化到一个地方。

#include <stdio.h>

int IncMultInt(int a, int b)
{
    a++;
    return a * b;
}

int main(int argc, char *argv[])

{
    int a = 5;
    int b = 7;

    printf("%d * %d = %d\n", a, b, IncMultInt(a, b));

    b = 9;

    // Create some local code with it's own local variable
    printf("%d * %d = %d\n", a, b,  ( { int _a = a+1; _a * b; } ) );

    return 0;
}

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

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

从c++ 11开始,你可以使用函数库以一种简洁和通用的方式来做到这一点。语法是,例如,

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);
}
typedef int function();

function *g(function *f)
{
    f();
    return f;
}

int main(void)
{
    function f;

    function *fn = g(f);

    fn();
}

int f() { return 0; }