Объяснить 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