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.