2009-05-03 3 views
10

Beispiel: Eine Funktion, die eine Funktion (die eine Funktion (that ...) und ein int) und eine int übernimmt.Wie kann ich einen Funktionszeiger schreiben, der eine Funktion seines eigenen Typs als Argument akzeptiert?

typedef void(*Func)(void (*)(void (*)(...), int), int); 

Es explodiert rekursiv wo (...). Gibt es einen fundamentalen Grund dafür, dass dies nicht möglich ist oder gibt es eine andere Syntax? Es scheint mir, dass es ohne eine Besetzung möglich sein sollte. Ich versuche wirklich, einen Versandtisch zu passieren, aber ich könnte das herausfinden, wenn ich nur diesen einen Typ passieren könnte.

+0

Explodiert es rekursiv, oder interpretiert es die "..." als Vararg, ohne dass Sie tatsächlich einen vorherigen Arg angeben, wo der Vararg-Punkt beginnen muss? –

+0

Ich weiß, ich sah eine SO Frage fast genau so, aber ich kann es nicht finden. –

+0

http://stackoverflow.com/q/793449/10396 – AShelly

Antwort

10

Sie können die Funktionszeiger in einer Struktur wickeln:

struct fnptr_struct; 
typedef void (*fnptr)(struct fnptr_struct *); 
struct fnptr_struct { 
    fnptr fp; 
}; 

Ich bin mir nicht sicher, ob dies eine Verbesserung beim Gießen ist. Ich vermute, dass es ohne die Struktur unmöglich ist, weil C erfordert, dass Typen definiert werden, bevor sie verwendet werden, und es gibt keine undurchsichtige Syntax für typedef.

+0

Schön, dass es einen Workaround gibt, traurig, es funktioniert nicht "nur". Ah, Vermächtnis. : - / – HostileFork

6

Es ist unmöglich, direkt zu tun. Ihre einzige Option besteht darin, das Funktionszeigerargument unspezifizierte Argumente akzeptieren zu lassen oder einen Zeiger auf eine Struktur zu akzeptieren, die den Funktionszeiger enthält, z. B. Dave suggested.

Verwandte Themen