2010-04-14 7 views
11

Ich habe gesucht, konnte aber keine Ergebnisse finden (meine Terminologie kann aus sein) so verzeihen Sie mir, wenn dies vorher gefragt wurde.Nennen Sie eine void * als eine Funktion, ohne einen Funktionszeiger zu deklarieren

Ich frage mich, ob es eine einfache Möglichkeit gibt, eine void* als eine Funktion in C aufzurufen, ohne zuerst einen Funktionszeiger zu deklarieren und dann dem Funktionszeiger die Adresse zuzuweisen;

dh. die Funktion unter der Annahme, Typ aufgerufen werden soll void(void)

void *ptr; 
ptr = <some address>; 
((void*())ptr)(); /* call ptr as function here */ 

mit dem obigen Code, ich Fehler C2066 erhalten: Gusstyp funktioniert illegal ist in VC2008

Wenn dies möglich ist, wie würde die Syntax abweichen für Funktionen mit Rückgabetypen und mehreren Parametern?

Antwort

22

Ihr gegossen werden sollte:

((void (*)(void)) ptr)(); 

Im Allgemeinen kann dies einfacher gemacht werden, indem eine typedef für die Funktion Zeigertyp zu erstellen:

Ich sollte jedoch darauf hinweisen, dass das Gießen eines gewöhnlichen Zeigers (Zeiger auf Objekt) zu oder von einem Funktionszeiger nicht streng legal ist (obwohl es ac ist Erweiterung).

+0

Genau das, was ich gesucht habe, danke. –

12

Ich werde schrecklich verwirrt, wenn ich auf Funktionstypen gieße. Es ist einfacher und besser lesbar den Funktionszeiger Typ typedef:

void *ptr = ...; 
typedef void (*void_f)(void); 
((void_f)ptr)(); 
11

In C++: reinterpret_cast< void(*)() > (ptr)()

Die Verwendung von reinterpret_cast erspart Ihnen eine Reihe von verwirrenden Klammern und die < > legt eindeutig den Typ neben dem Anruf selbst.

Verwandte Themen