Wie lese ich diese komplexe Deklaration in C? [duplicate]
Lesezeit: 5 Minuten
Amit Singh Tomar
Mögliches Duplikat:
Was ist die Bedeutung dieses Stück Code? void (*signal(int sig, void (*func)(int)))(int);
Ich habe eine komplexe Deklaration, die aus der Header-Datei “signal.h” entnommen wurde, und unten ist die Deklaration.
void (*signal(int sig, void (*func)(int)))(int);
Nun, wie parse ich es? Wie
signal ist eine Funktion, die zwei Argumente ‘sig’ vom Typ int und ‘func’ nimmt, was ein Zeiger auf eine Funktion ist, die int als Argument nimmt und den Typ void zurückgibt; es gibt einen Zeiger auf die Funktion zurück, nimmt int als Argument und gibt void zurück.
Ist es OK oder Signal ist ein Zeiger auf Funktion?
typedef int foo(void): foo ist ein Zeiger auf eine Funktion, aber Sie können es abkürzen und sagen, dass es eine Funktion ist, weil Sie es tun können foo x; x();
– Benoît
29. Februar 2012 um 14:32 Uhr
@Benoit kannst du es bitte als Antwort hinzufügen?
– Amit Singh Tomar
29. Februar 2012 um 14:33 Uhr
Ich bin mir nicht sicher, auf welcher Grundlage meine Frage geschlossen wurde, was ich gefragt habe, unterscheidet sich von dem, was zuvor gestellt wurde.
– Amit Singh Tomar
1. März 2012 um 7:46 Uhr
Johannes Bode
Beginnen Sie mit dem Bezeichner ganz links und arbeiten Sie sich nach außen vor, wobei Sie sich daran erinnern [] und () vorher binden *Also *a[] ist ein Array von Zeigern, (*a)[] ist ein Zeiger auf ein Array, *f() ist eine Funktion, die einen Zeiger zurückgibt, und (*f)() ist ein Zeiger auf eine Funktion:
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 ordnet eine Signal-Handler-Funktion zu func mit Signal sigund gibt den Zeiger auf die alte Signalhandlerfunktion zurück:
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);
...
}
+1 Sehr schön, Schritt-für-Schritt-Erklärung.
– watbywbarif
29. Februar 2012 um 14:46 Uhr
Danke @John für deine Gedanken, aber einige Benutzer hier sind dagegen und sagen, Signal sei ein Zeiger auf die Funktion.
– Amit Singh Tomar
29. Februar 2012 um 14:51 Uhr
@Amit – In Aarons Fall die Schnur, die er gefüttert hat cdecl ist nicht das, was Sie in Ihrer Frage geschrieben haben.
– Johannes Bode
29. Februar 2012 um 15:00 Uhr
+1 Einer der Gründe, warum Sie typedef für Funktionszeiger verwenden: Es ist einfacher für das Gehirn. 🙂
– Netcoder
29. Februar 2012 um 16:33 Uhr
@netcoder: Es kann solche Deklarationen sicherlich leichter lesbar machen, aber ich mag es zu wissen, wie die Funktionssignatur aussieht, ohne nach der Typedef suchen zu müssen. sighandler func; sagt mir nicht wie verwendenfuncwohingegen void (*func)(int); tut.
Signal als Funktion deklarieren (int, Zeiger auf Funktion (int), die void zurückgibt), Zeiger auf Funktion (int), die void zurückgibt, zurückgeben
für die Eingabe
void (*signal(int, void(*)(int)))(int)
Das heisst signal ist eine Funktion. Das Ergebnis des Anrufs signal ist ein Zeiger auf eine Funktion void f(int).
Erläuterung: Die signal() Aufruf installiert a Neu Signalhandler und gibt die zurück alt Signal-Handler (damit Sie es später wiederherstellen können, wenn Sie möchten).
Aber in meinem Kontext ist das anders, oder?
– Amit Singh Tomar
29. Februar 2012 um 14:36 Uhr
@Aaron – Sie haben nicht dieselbe Deklaration wie das OP eingegeben.
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)
// Bearbeiten unter Bezugnahme auf Johns Antwort.
Nun, wie signalisiert der Zeiger, dass er funktioniert?
– Amit Singh Tomar
29. Februar 2012 um 14:39 Uhr
Es sagt, dass das Signal ein Funktionsrückgabezeiger ist.
– Amit Singh Tomar
29. Februar 2012 um 14:42 Uhr
Es ist jetzt wirklich verwirrend, die meisten Antworten sagen, dass die Funktion den Zeiger zurückgibt, und Sie sagen etwas anderes.
– Amit Singh Tomar
29. Februar 2012 um 14:46 Uhr
Wie ich in meiner Antwort sagte, () bindet vorher *Also *f() ist eine Funktion, die einen Zeiger zurückgibt, nicht ein Zeiger auf eine Funktion. Die Form der Erklärung für signal beinhaltet *signal(...)Also signal ist definitiv eine Funktion, die einen Zeiger zurückgibt.
– Johannes Bode
29. Februar 2012 um 14:57 Uhr
Danke @JohnBode für deine nette Erklärung. Ich habe meine war-falsche Antwort bearbeitet.
– Ade YU
29. Februar 2012 um 15:02 Uhr
Nein das stimmt. signal nimmt 2 Argumente, ein int und einen Zeiger auf eine Funktion und gibt einen Zeiger auf eine Funktion zurück (mit der gleichen Signatur wie die func Streit.)
Aber hier wurde ich verwirrt joyofprogramming.com/Docs_ColumnArticles/36-JoP-Dec-09.pdf
– Amit Singh Tomar
29. Februar 2012 um 14:29 Uhr
typedef int foo(void)
: foo ist ein Zeiger auf eine Funktion, aber Sie können es abkürzen und sagen, dass es eine Funktion ist, weil Sie es tun könnenfoo x; x();
– Benoît
29. Februar 2012 um 14:32 Uhr
@Benoit kannst du es bitte als Antwort hinzufügen?
– Amit Singh Tomar
29. Februar 2012 um 14:33 Uhr
Ich bin mir nicht sicher, auf welcher Grundlage meine Frage geschlossen wurde, was ich gefragt habe, unterscheidet sich von dem, was zuvor gestellt wurde.
– Amit Singh Tomar
1. März 2012 um 7:46 Uhr