В одном из ответов на вопрос How do function pointers in C work? один пользователь объясняет, как использовать указатели функций в возвращаемых значениях. Вот код, о котором идет речь:Возврат указателя на функцию в синтаксисе Си
// this is a function called functionFactory which receives parameter n
// and returns a pointer to another function which receives two ints
// and it returns another int
int (*functionFactory(int n))(int, int) {
printf("Got parameter %d", n);
int (*functionPtr)(int,int) = &addInt;
return functionPtr;
}
Для меня так, как вы объявляете функцию functionFactory очень странно - мне кажется, что вы перепутать тип возврата (указатель на функцию) и само имя функции (functionFactory).
Например, когда мы пишем простую функцию, которая возвращает квадрат аргумента мы пишем что-то вроде
int square(int n){
return n*n;
}
Очевидно, типа того, что мы возвращаемся на левом, а затем записать имя функции а затем какие параметры он принимает. Поэтому, когда мы возвращаем указатель на функцию, почему бы нам не написать что-то вроде:
(int (*function)(int, int)) functionFactory(int n) { ...
Здесь Возвращаемый тип (который является указателем на функцию) и ее детали (например, что функция, которую мы указываем возвращает и то, что он принимает в качестве параметров) явно слева, а имя функции functionFactory - справа. Мне моя версия кажется гораздо более логичной и понятной, почему бы нам не написать ее так?
C использует инфиксную нотацию для деклараторов. Это соответствует принципу «заявление следует за использованием». Мы получаем массив как 'a [5]', поэтому он объявлен как 'int a [5];', а не 'int [5] a;'. То же самое происходит с типами функций. –
'int (* function) (int, int) functionFactory (int n) {...' "* Здесь тип возврата (который является указателем на функцию) *" - так что же самое первое 'int' в том, что line, если не тип возврата? – TessellatingHeckler
Вы можете, конечно, объявить typedefs для этих указателей функций, а затем объявления вашей функции с помощью этих typedef будут выглядеть более «нормальными». – paddy