Das allgemeine Verfahren : Finde den am weitesten links liegenden Identifikator und arbeite dich raus. Wenn eine explizite Gruppierung mit Klammern fehlt, binden Postfixoperatoren wie ()
und []
vor unären Operatoren wie *
; damit die folgenden Aussagen wahr sind:
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
diese Regeln auf die Erklärung Auftragen, es setzt sich wie
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
Kurz gesagt, signal
gibt einen Zeiger auf eine Funktion Rückkehr void
. signal
benötigt zwei Parameter: eine Ganzzahl und einen Zeiger auf eine andere Funktion, die void
zurückgibt.
Sie könnten typedefs verwenden, um dies einfacher zu lesen (und die man-Seite für signal
auf Ubuntu Linux tut genau das); Ich denke jedoch, dass es wertvoll ist, die nicht-typedef-Version zu zeigen, um genau zu demonstrieren, wie die Syntax funktioniert. Die Typdef-Einrichtung ist wunderbar, aber Sie müssen wirklich verstehen, wie die zugrunde liegenden Typen funktionieren, um sie effektiv zu nutzen.
Die signal
-Funktion richtet einen Signal-Handler ein; Das zweite Argument ist die Funktion, die ausgeführt werden soll, wenn ein Signal empfangen wird. Ein Zeiger auf den aktuellen Signalhandler (falls vorhanden) wird zurückgegeben.
Zum Beispiel, wenn Sie Ihr Programm wollen Interrupt-Signale zu verarbeiten (wie von 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 I erweitert den Beispielcode für signal
auf etwas, das hoffentlich mehr illustrativ ist.
Get 'cdecl'. Es wird dir all diese Dinge erzählen. Ich frage: 'explain void (* signal (int, void (*) (int))) (int);' und es antwortet: 'deklariere das Signal als Funktion (int, Zeiger auf Funktion (int) gibt void zurück) Funktion (int) Rückgabe void –
versuchen http://cdecl.org/ –