c

¿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.