Как использовать аргумент функции функции в реализации функции? - PullRequest
3 голосов
/ 05 марта 2019

Если у меня есть такое объявление:

int foo1 (int foo2 (int a));

Как я могу реализовать эту функцию foo1?Например,

int foo1 (int foo2 (int a))
{
    // How can I use foo2 here, which is the argument?
}

А как мне вызвать функцию foo1 в main?Нравится:

foo1(/* ??? */);

Ответы [ 3 ]

8 голосов
/ 05 марта 2019

Когда вы объявляете параметр функции как функцию, компилятор автоматически настраивает его тип на «указатель на функцию».

int foo1 (int foo2 (int a))

в точности совпадает с

int foo1 (int (*foo2)(int a))

(Это похоже на то, как объявление параметра функции в виде массива (например, int foo2[123]) автоматически делает его указателем (например, int *foo2).)

Что касается того, как вы можете использовать foo2: вы можетевызовите его (например, foo2(42)) или вы можете разыменовать его (*foo2), который (как обычно с функциями) сразу же снова затухает до указателя (который вы затем можете вызвать (например, (*foo2)(42)), или снова разыменовываете (**foo2), который немедленно возвращается к указателю, который ...).

Чтобы вызвать foo1, вам нужно передать ему указатель на функцию. Если у вас нет существующего указателя на функцию,Вы можете определить новую функцию (за пределами main), например:

int bar(int x) {
    printf("hello from bar, called with %d\n", x);
    return 2 * x;
}

Затем вы можете сделать

foo1(&bar);  // pass a pointer to bar to foo1

или эквивалентно

foo1(bar);  // functions automatically decay to pointers anyway
0 голосов
/ 05 марта 2019

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

 #include <stdio.h>


/* Declaration of foo1 . It receives a specific function pointer foo2 and an integer. */
int foo1 (int (*foo2)(int), int a);

int cube(int number)
{
    return (number * number * number);
}

int square(int number)
{
    return (number * number);
}

int foo1 (int (*foo2)(int), int a)
{
    int ret;

    /* Call the foo2 function here. */
    ret = foo2(a);

    printf("Result is: %d\r\n", ret);

    return (ret);
}

int main()
{
    int a = 3;

    foo1(square, a);
    foo1(cube, a);

    return 0;
}
0 голосов
/ 05 марта 2019

Возможно, вам поможет этот простой пример:

#include <stdio.h>

int foo1 (int foo2 (int),int i);
int sub_one (int);
int add_one (int);

int main() {
    int i=10,j;
    j=foo1(sub_one,i);
    printf("%d\n",j);
    j=foo1(add_one,i);
    printf("%d\n",j);
}

int sub_one (int i) {
    return i-1;
}
int add_one (int i) {
    return i+1;
}

int foo1 (int foo2 (int),int i) {
    return foo2(i);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...