Funktionszeiger in Variable speichern, und Funktion anschließend aufrufen?
-
hi,
wie ist es möglich, dass ich einen Funktionszeiger in eine Variable (selbst ein Zeiger) speichere, und mithilfe der nun in dieser Variable gespeicherten Adresse die darin enthaltene Funktion wieder aufrufe? danke!
-
?? oO
Meinst du sowas:
void method() { std::cout << "hi"; } // ... void (*fp)() = method; void* p = fp; (static_cast<void (*)()>(p))();
-
Jau danke, genau das wollte ich wissen.
Schönen abend noch!
-
Das ist UB.
Man darf zwar jeden Datenzeiger nach void* casten und wieder zurück, aber nicht Funktionszeiger.
Ist doof, aber der Standard sagt halt so.Die meisten Compiler unterstützen es freilich trotzdem (weil's normal auch garkein Problem ist).
EDIT: d.h. ich bin mir nur 90% sicher dass es UB ist - wenn's nicht UB ist ist es "implementation defined" (würde mich aber sehr wundern).
-
-
hustbaer schrieb:
Die meisten Compiler unterstützen es freilich trotzdem (weil's normal auch garkein Problem ist).
Das geht zum Beispiel unter MS-DOS in Speichermodellen schief, in denen Datenzeiger near (nur Offset) und Funktionszeiger far (Segment:Offset) sind.
Der OP hat aber gar nichts von void* gesagt, ich frage mich, ob die Frage wirklich so gemeint war. Denn fp ist ja in dem Beispiel schon eine Variable, über die man auch die Funktion wieder aufrufen kann.
-
@finix: von member pointern war glaube ich nie die Rede
@Bashar: ja, ich weiss dass es Plattformen gibt auf denen es nicht geht - auf "den üblichen Plattformen" (Win32, Linux, ...) geht es aber wie gesagt. Ich wollte auch hauptsächlich darauf hinweisen dass nicht garantiert ist dass es geht, nur wollte ich auch gleich dem unvermeidlichen "funktioniert aber trotzdem sogut wie überall" vorgreifen.
-
Ich wollte gar nichts gegen dich sagen, nur Hintergrundinformationen liefern.

-
hustbaer schrieb:
@finix: von member pointern war glaube ich nie die Rede
URI != Content:
parashift FAQ schrieb:
[33.8] Can I convert a pointer-to-function to a void*?
-
@finix: sooorry
