¿Cómo leo esta declaración compleja en C?
(5)
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ñales con una señal sig
, y devuelve el puntero a la función de controlador de señales 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);
...
}
Posible duplicado:
¿Cuál es el significado de esta pieza de código? void (* señal (int sig, void (* func) (int))) (int);
Tengo una declaración compleja que se ha tomado del archivo de cabecera "signal.h", y a continuación se muestra la declaración.
void (*signal(int sig, void (*func)(int)))(int);
Ahora, ¿cómo lo analizo? Como
señal es 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?
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);
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.
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.