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