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