2010-02-16 3 views

Antwort

17

Die Art Signatur der signal Funktion ist ein bisschen mehr deutlich, wenn ein typedef wird für die Funktionszeiger verwendet, die herumgereicht werden:

typedef void (*sighandler_t)(int); 
sighandler_t signal(int signo, sighandler_t func); 

sighandler_t ein Zeiger auf eine Funktion ist, die einen int Parameter und gibt nichts nimmt. Die signal-Funktion nimmt einen solchen Funktionszeiger als zweiten Parameter. Es gibt auch einen Funktionszeiger dieses Typs zurück.

1

C-Deklarationen müssen von innen nach außen gelesen werden. Der schwierige Teil bei komplexen Funktionsdeklarationen ist herauszufinden, welcher der innerste Deklarator ist (wo zu starten). Es ist in der Regel der erste Bezeichner, der kein Typbezeichner ist. Also in diesem Fall:

void (*signal(int signo, void *(func)(int)))(int) 

ist die declarator signal. Innerhalb der Klammer haben Suffixe eine höhere Priorität als Präfixe, so dass signal eine Funktion ist, die zwei Argumente (den (int signo, void *(func)(int)) Teil) nimmt, die einen Zeiger (das Präfix *) an eine Funktion zurückgibt, die einen einzigen int arg nimmt (die (int) am Ende), und zurück void