Encontré este fragmento de código y me perdí por completo al interpretar su significado.¿Cuál es el significado de este fragmento de código? void (* signal (int sig, void (* func) (int))) (int);
#include <signal.h>
void (*signal(int sig, void (*func)(int)))(int);
¿Cuál es la explicación detallada del código en la línea 2?
Sé que void
y int
son tipos, el * func es un puntero para una función y los corchetes son para prioridad. Pero todavía no obtengo la (* señal ...), la (int), y todo combinado entre sí. Cuanto más detallado mejor.
Probablemente he sabido el significado/efecto de esta declaración. Pero tenía que hacer algunas pruebas más para ayudar a entender lo que está pasando, de la siguiente manera:
1 #include <signal.h>
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(){}
En el código anterior, rompí void (*signal(int sig, void (*func)(int)))(int)
en dos líneas. Para la línea 3, He intentado tanto void (*signal)(int)
y void (signal)(int)
, con el mismo resultado de error que indicaba que estaba tratando de redeclare signal
:
TestDeclaration.c:2: error: 'signal' redeclared as different kind of symbol /usr/include/signal.h:93: error: previous declaration of 'signal' was here
TestDeclaration.c:3: error: 'signal' redeclared as different kind of symbol /usr/include/signal.h:93: error: previous declaration of 'signal' was here
Ahora sé que tanto los ensayos son formas incorrectas de declaración, pero ¿por qué son incorrectos ? ¿Por qué la forma original de declaración NO es una redeclaración?
+1 para mostrar que en realidad se entiende * algunos * de ella en lugar de * ninguno * de ella. – BoltClock
Pruebe http://www.cdecl.org –
Curiosamente, cdecl.org da un error de sintaxis en este caso. ¿Alguien puede explicar esto? –