La procédure générale : trouvez l'identifiant le plus à gauche et travaillez votre chemin. En l'absence d'un regroupement explicite avec des parenthèses, les opérateurs postfix tels que ()
et []
se lient avant les opérateurs unaires comme *
; ainsi, les éléments suivants sont tout à fait vrai:
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
L'application de ces règles à la déclaration, il se décompose comme
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 bref, signal
renvoie un pointeur vers une fonction renvoyant void
. signal
prend deux paramètres: un entier et un pointeur vers une autre fonction retournant void
.
Vous pouvez utiliser typedefs pour faciliter la lecture (et la page de manuel pour signal
sur Ubuntu linux ne fait que cela); cependant, je pense qu'il est utile de montrer la version non-typedef'd pour démontrer exactement comment fonctionne la syntaxe. La facilité de typedef est merveilleuse, mais vous devez vraiment comprendre comment les types sous-jacents fonctionnent afin de l'utiliser efficacement. La fonction signal
configure un gestionnaire de signaux; le deuxième argument est la fonction qui doit être exécutée si un signal est reçu. Un pointeur vers le gestionnaire de signal en cours (le cas échéant) est renvoyé.
Par exemple, si vous voulez que votre programme pour gérer des signaux d'interruption (tels que 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;
}
EDIT Je tendis l'exemple de code pour signal
à quelque chose qui est je l'espère plus d'illustration.
Récupère 'cdecl'. Ça vous dira toutes ces choses. Je demande: 'expliquer void (* signal (int, void (*) (int))) (int);' et il répond: 'déclarer le signal en tant que fonction (int, pointeur sur la fonction (int) renvoyer void) renvoyer le pointeur function (int) retourner void' –
essayer http://cdecl.org/ –