2015-04-22 5 views
6

Ich frage mich, wie ich eine Funktion schreibe, die einen Zeiger auf eine Funktion zurückgibt, die einen Funktionszeiger ohne Typdef zurückgibt. Zum Beispiel eine Funktion, die ein Funktionszeiger zurückgibt, kann sein definiert als:Wie deklariere ich eine Funktion, die einen Zeiger auf eine Funktion zurückgibt, die einen Funktionszeiger zurückgibt, ohne ein Typedef in C zu verwenden?

type (*f_name(..))(..){..} 

Also das einen Zeiger auf eine Funktion gibt, die einen ‚Typ‘ zurückgibt, jetzt wie erklären Sie die Funktion, wenn der ‚Typ‘ a Funktionszeiger. Da mein Vorgesetzter jedoch keine Typedefs verwenden möchte, kann ich sie nicht verwenden.

Danke für jede Hilfe, die Sie geben können.

+0

Ersetzen Sie einfach 'type' durch einen unbenannten Funktionszeiger. –

+4

Ihr Vorgesetzter möchte keine Typedefs? Was für eine seltsame Idee ... Es ist unklar, was Sie wollen. Möchten Sie einfach eine Funktion, die einen Funktionszeiger zurückgibt, oder möchten Sie, dass es rekursiv Funktionen zurückgibt, die Funktionszeiger zurückgeben? Was hast du probiert? – Eregrith

+0

Tun Sie es zuerst mit '' typedef'', dann lösen Sie die '' typedef''s manuell auf. – Philip

Antwort

7

Für Fragen wie diese gibt es ein raffiniertes Dienstprogramm namens cdecl (http://cdecl.org/), die zwischen Englisch und C-Deklarationen übersetzt.

Zum Beispiel

cdecl> declare f as function (int) returning pointer to function (char) returning pointer to function (void) returning long 

gibt die Antwort

long (*(*f(int))(char))(void) 

und in der anderen Richtung,

cdecl> explain int (*(*g(float))(double, double))(char) 

gibt

declare g als Funktion (float) zurückkehr Zeiger auf Funktion (double, double) zurückkehr Zeiger auf Funktion (char) zurückkehr int

+2

BTW, es gibt Web-Schnittstelle dafür: http: // cdecl.org/ – myaut

+1

Yup, habe gerade die URL hinzugefügt. Danke für das Heads-up. – drRobertz

+0

Danke, dieses Dienstprogramm ist nett und die gegebene Antwort ist, was ich gesucht habe. – user3711004

3

Zuerst schreiben wir eine Funktion ein int zu nehmen und einen Schwimmer zurückkehrt.

Dann schreiben wir eine Funktion, die nichts nimmt und einen Zeiger auf eine Funktion zurückgibt, die ein int nimmt und einen float zurückgibt.
Dieser Zeiger ist vom selben Typ wie First.

float (*Second(void))(int) 
{ 
    float (*f)(int) = First ; 

return f ; 
} 

Schließlich schreiben wir eine Funktion ein Zeichen zu nehmen und einen Zeiger auf eine Funktion nimmt nichts zurückkehrt und einen Zeiger auf eine Funktion der Rückkehr einen int zu nehmen und einen Schwimmer zurück. Dieser Zeiger ist vom Typ Second.

float (*(*Third(char c))(void))(int) 
{ 
    (void)c ; 
    float (*(*s)(void))(int) = Second ; 

return s ; 
} 

Wenn Sie die Prototypen aneinander entlang platzieren, beginnt die seltsame Syntax Sinn zu machen:

float  First     (int) ; 
float ( *Second   (void))(int) ; 
float (*(*Third(char))(void))(int) ; 

Der einzige Unterschied eine Nicht-Funktionszeiger auf die Rückkehr, dass die Funktionszeiger Parameter am Ende gehen der Deklaration und den Klammern:

  type* Name(void) ; 
function_type (*Name(void))(int) ;