Как мне объявить функцию, которая возвращает указатель на функцию?

#c #function-pointers

#c #указатели на функции

Вопрос:

Представьте функцию myFunctionA с параметром double и int:

 myFunctionA (double, int);
  

Эта функция должна возвращать указатель на функцию:

 char (*myPointer)();
  

Как мне объявить эту функцию на C?

Ответ №1:

typedef твой друг:

 typedef char (*func_ptr_type)();
func_ptr_type myFunction( double, int );
  

Ответ №2:

 void (*fun(double, int))();
  

Согласно правилу»вправо-влево», fun это функция double, int возврата указателя на функцию с возвращаемыми неопределенными параметрами void .

РЕДАКТИРОВАТЬ: Это еще одна ссылка на это правило.

ПРАВКА 2: Эта версия предназначена только для компактности и для демонстрации того, что это действительно можно сделать.

Здесь действительно полезно использовать typedef. Но не на указатель, а на сам тип функции.

Почему? Потому что тогда ее можно использовать как своего рода прототип и таким образом гарантировать, что функции действительно совпадают. И поскольку идентификатор в качестве указателя остается видимым.

Итак, хорошим решением было бы

 typedef char specialfunc();
specialfunc * myFunction( double, int );

specialfunc specfunc1; // this ensures that the next function remains untampered
char specfunc1() {
    return 'A';
}

specialfunc specfunc2; // this ensures that the next function remains untampered
// here I obediently changed char to int -> compiler throws error thanks to the line above.
int specfunc2() {
    return 'B';
}

specialfunc * myFunction( double value, int threshold)
{
    if (value > threshold) {
        return specfunc1;
    } else {
        return specfunc2;
    }
}
  

Комментарии:

1. Спасибо за редактирование, но я уже дал вам согласие и 1. Это было именно то, что я искал.

2. Спасибо. Я просто хотел а) внести ясность и б) дать подсказки для хорошей практики.

Ответ №3:

Создайте typedef:

 typedef int (*intfunc)(void);

int hello(void)
{
    return 1;
}

intfunc hello_generator(void)
{
    return hello;
}

int main(void)
{
    intfunc h = hello_generator();
    return h();
}
  

Ответ №4:

 char * func() { return 's'; }

typedef char(*myPointer)();
myPointer myFunctionA (double, int){ /*Implementation*/ return amp;func; }