Как передать функцию в качестве параметра в C?

Я хочу создать функцию, которая выполняет функцию, передаваемую параметром в наборе данных. Как передать функцию в качестве параметра в C?

5 ответов


декларация

прототип функции, которая принимает параметр функции, выглядит следующим образом:

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

здесь указано, что параметр f будет указателем на функцию, которая имеет void тип возврата и который принимает один


этот вопрос уже имеет ответ для определения указателей функций, однако они могут быть очень грязными, особенно если вы собираетесь передавать их вокруг своего приложения. Чтобы избежать этой неприятности, я бы рекомендовал вам ввести указатель функции в нечто более читаемое. Например.

typedef void (*functiontype)();

объявляет функцию, которая возвращает void и не принимает никаких аргументов. Чтобы создать указатель функции на этот тип, теперь вы можете сделать:

void dosomething() { }

functiontype func = &dosomething;
func();

для a функция, которая возвращает int и принимает символ, который вы бы сделали

typedef int (*functiontype2)(char);

и использовать его

int dosomethingwithchar(char a) { return 1; }

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

есть библиотеки, которые могут помочь с превращением указателей функций в приятные читаемые типы. The повысить функцию библиотека велика и стоит усилий!

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

намного лучше, чем выше.


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

передать адрес функции в качестве параметра другой функции как показано ниже

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

до указатель на функцию. Синтаксис немного громоздкий, но он действительно мощный, как только вы познакомитесь с ним.