Qual è il significato di questo pezzo di codice? void (* signal (int sig, void (* func) (int))) (int);

Mi sono imbattuto in questo pezzo di codice e mi sono completamente perso interpretando il suo significato.

#include  void (*signal(int sig, void (*func)(int)))(int); 

Qual è una spiegazione dettagliata del codice alla riga 2?

So che void e int sono tipi, il * func è un puntatore per una funzione e le parentesi sono prioritarie. Ma ancora non ottengo il (* segnale …), il (int) e l’intera cosa combinati insieme. Più è dettagliato, meglio è.

Probabilmente ho conosciuto il significato / l’effetto di questa dichiarazione. Ma ho dovuto fare altre prove per aiutarmi a capire cosa sta succedendo, come di seguito:

  1 #include  2 void (*signal)(int sig, void (*func)(int)); 3 void (*signal)(int); // then void (signal)(int) again. 4 //void (*signal(int sig, void (*func)(int)))(int); //break this line into two lines above 5 6 int main(){} 

Nel codice precedente, ho rotto void (*signal(int sig, void (*func)(int)))(int) in due righe. Per la riga 3, ho provato sia void (*signal)(int) che void (signal)(int) , con lo stesso risultato dell’errore che indicava che stavo cercando di ridichiarare il signal :

TestDeclaration.c: 2: errore: ‘signal’ redeclared come diverso tipo di simbolo /usr/include/signal.h: 93: errore: la precedente dichiarazione di ‘signal’ era qui
TestDeclaration.c: 3: errore: ‘signal’ redeclared come diverso tipo di simbolo /usr/include/signal.h: 93: errore: la precedente dichiarazione di ‘signal’ era qui

Ora so che entrambe le prove sono modi di dichiarazione sbagliati, ma perché sono sbagliati? Perché il modo originale di dichiarare NON è una ridichiarazione?