El procedimiento general : encuentre el identificador de la izquierda y hágalo salir. En ausencia de una agrupación explícita con paréntesis, los operadores de postfix como ()
y []
se unen antes de los operadores unarios como *
; Por lo tanto, los siguientes son todas verdaderas:
T *x[N] -- x is an N-element array of pointer to T
T (*x)[N] -- x is a pointer to an N-element array of T
T *f() -- f is a function returning a pointer to T
T (*f)() -- f is a pointer to a function returning T
aplicación de estas reglas a la declaración, se descompone como
signal -- signal
signal( ) -- is a function
signal( signo, ) -- with a parameter named signo
signal(int signo, ) -- of type int
signal(int signo, func ) -- and a parameter named func
signal(int signo, *func ) -- of type pointer
signal(int signo, (*func)( )) -- to a function
signal(int signo, (*func)(int)) -- taking an int parameter
signal(int signo, void (*func)(int)) -- and returning void
*signal(int signo, void (*func)(int)) -- returning a pointer
(*signal(int signo, void (*func)(int)))( ) -- to a function
(*signal(int signo, void (*func)(int)))(int) -- taking an int parameter
void (*signal(int signo, void (*func)(int)))(int); -- and returning void
En resumen signal
, devuelve un puntero a una función que devuelve void
. signal
toma dos parámetros: un entero y un puntero a otra función que devuelve void
.
Puede usar typedefs para que esto sea más fácil de leer (y la página del manual para signal
en Ubuntu Linux hace precisamente eso); sin embargo, creo que es valioso mostrar la versión no tipificada para demostrar exactamente cómo funciona la sintaxis. La instalación typedef es maravillosa, pero realmente necesita comprender cómo funcionan los tipos subyacentes para usarla de manera efectiva.
La función signal
configura un manejador de señal; el segundo argumento es la función que se debe ejecutar si se recibe una señal. Se devuelve un puntero al controlador de señal actual (si existe).
Por ejemplo, si desea que su programa para manejar señales de interrupción (por ejemplo, de Ctrl-C):
static int g_interruptFlag = 0;
void interruptHandler(int sig)
{
g_interruptFlag = 1;
}
int main(void)
{
...
/**
* Install the interrupt handler, saving the previous interrupt handler
*/
void (*oldInterruptHandler)(int) = signal(SIGINT, interruptHandler);
while (!g_interruptFlag)
{
// do something interesting until someone hits Ctrl-C
}
/**
* Restore the previous interrupt handler (not necessary for this particular
* example, but there may be cases where you want to swap out signal handlers
* after handling a specific condition)
*/
signal(SIGINT, oldInterruptHandler);
return 0;
}
EDITAR extendí el código de ejemplo para signal
a algo que es de esperar más ilustrativo.
Get 'cdecl'. Te dirá todas estas cosas. Pregunto: 'explicar void (* signal (int, void (*) (int))) (int);' y responde: 'declare signal como function (int, puntero a function (int) return void) devolviendo el puntero a function (int) return void' –
intente http://cdecl.org/ –