It’s the declaration of a function taking an int
and a pointer to a function (taking int
returning void) and returning a pointer to a function (taking int
and returning void).
Explanation, or guide to interpretation
You can interpret by treating everything in parentheses as a single entity and then working inwards using the “declaration follows usage” rule.
void (*signal(int sig, void (*func)(int)))(int);
The entity in the brackets looks like a function taking int
and returning void
.
Stripping away the outer part:
*signal(int sig, void (*func)(int))
So, signal
takes some parameters and returns something that can be dereferenced (due to the leading *
) to form a function taking int
and returning void
.
This means signal
is a function returning a pointer to a function (taking int
and returning void
).
Looking at the parameters it takes an int
(i.e. sig
) and void (*func)(int)
which is a pointer to a function (taking int
and returning void
).