Пожалуйста, объясните подпись этого типа: void (*signal(int signo, void *(func)(int)))(int)
Объяснить void (* signal (int signo, void * (func) (int))) (int)
Ответ 1
Типичная подпись функции signal
более понятна, когда typedef используется для указателей функций, которые передаются:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signo, sighandler_t func);
sighandler_t
- это указатель на функцию, которая принимает параметр int
и ничего не возвращает. Функция signal
принимает такой указатель функции, как второй параметр. Он также возвращает указатель на функцию этого типа.
Ответ 2
С декларации C должны быть прочитаны изнутри. Сложная часть с описаниями сложных функций выясняется, что является самым внутренним декларатором (с чего начать). Его обычно первый идентификатор, который не является идентификатором типа. Итак, в этом случае:
void (*signal(int signo, void *(func)(int)))(int)
декларатор signal
. В скобках суффиксы имеют более высокий приоритет, чем префиксы, поэтому signal
- это функция, принимающая два аргумента (часть (int signo, void *(func)(int))
), которая возвращает указатель (префикс *
) функции, принимающей один int arg ((int)
в конце) и возвращая void