¿Cómo leo esta statement compleja en C?

Posible duplicado:
¿Cuál es el significado de esta pieza de código? void (* señal (int sig, void (* func) (int))) (int);

Tengo una statement compleja que se ha tomado del archivo de encabezado “signal.h”, y a continuación se muestra la statement.

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

Ahora, ¿cómo lo analizo? Como

señal es la función que toma dos argumentos ‘sig’ de tipo int y ‘func’, que es un puntero a una función que toma int como argumento y devuelve un tipo vacío. devuelve un puntero a la función tomando int como argumento y devolviendo vacío.

¿Está bien o la señal es un puntero para funcionar?

Comience con el identificador que se encuentra más a la izquierda y trabaje para salir, recordando que [] y () unen antes de * , por lo que *a[] es una matriz de punteros, (*a)[] es un puntero a una matriz, *f() es una función que devuelve un puntero, y (*f)() es un puntero a una función:

  signal -- signal signal( ) -- is a function signal( sig, ) -- with a parameter named sig signal(int sig, ) -- of type int signal(int sig, func ) -- and a parameter named func signal(int sig, (*func) ) -- which is a pointer signal(int sig, (*func)( )) -- to a function signal(int sig, (*func)(int)) -- taking an int parameter signal(int sig, void (*func)(int)) -- and returning void *signal(int sig, void (*func)(int)) -- returning a pointer (*signal(int sig, void (*func)(int)))( ) -- to a function (*signal(int sig, void (*func)(int)))(int) -- taking an int parameter void (*signal(int sig, void (*func)(int)))(int); -- and returning void 

signal asocia una función de func controlador de señal con una señal sig , y devuelve el puntero a la función de controlador de señal anterior:

 void new_interrupt_handler(int sig) { ... // do something interesting with interrupt signal } int main(void) { void (*old_interrupt_handler)(int); ... /** * Set up our new interrupt handler */ old_interrupt_handler = signal(SIGINT, new_interrupt_handler); ... /** * Restore original interrupt handler */ signal(SIGINT, old_interrupt_handler); ... } 

Usando cdecl.org , obtienes

declarar señal como función (int, puntero a función (int) devolviendo el vacío) devolviendo puntero a función (int) devolviendo el vacío

para la entrada

 void (*signal(int, void(*)(int)))(int) 

Esto significa que la signal es una función. El resultado de la signal de llamada es un puntero a una función void f(int) .

Explicación: la llamada a signal() instala un nuevo controlador de señales y devuelve el antiguo controlador de señales (para que pueda restaurarlo más tarde si lo desea).

signal es una función que toma dos parámetros y devuelve un puntero a una función que toma un int como parámetro y devuelve un void .

Los dos parámetros que toma la signal son un int y un puntero a una función que toma int como parámetro y devuelve void .

Y sí, tienes la descripción y la idea general correcta.

No, eso es correcto. la señal toma 2 argumentos, un int y un puntero a una función y devuelve un puntero a una función (con la misma firma que el argumento func ).

Es similar al (imo) más legible:

 typedef void (*sig_func)(int); sig_func signal(int sig, sig_func func); 
 void (*signal(int, void (*)(int)))(int); signal( ) // signal is a function int, void (*)(int) // the parameter types of the function: // an int and a function pointer (take int, return void) void (* )(int); // the return type of the function: // a function pointer (take int, return void) 

// Editar refiriéndose a la respuesta de Juan.