Heim > Artikel > Backend-Entwicklung > Wie kann ich ein „void*“ sicher in einen Funktionszeiger in C umwandeln?
Funktionszeigerumwandlung in C
In C ist die direkte Konvertierung eines void* in einen Funktionszeiger im Allgemeinen nicht zulässig. Es gibt jedoch einige Ansätze, die je nach Implementierung und Plattform funktionieren können.
Methode 1 (Undefiniertes Verhalten):
Diese Methode beinhaltet doppeltes Reinterpret_casting:
<code class="cpp">void *gptr = dlsym(some symbol..); typedef void (*fptr)(); fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>
Methode 2 (vermeidet direkte Konvertierung):
Diese Methode verwendet einen Zwischenschritt, um die Funktionszeigeradresse in einer Variablen zu speichern:
<code class="cpp">fptr my_ptr = 0; reinterpret_cast<void*&>(my_ptr) = gptr;</code>
Langsamere, aber transparentere Version von Methode 2:
<code class="cpp">void (**object_ptr)() = &my_ptr; void ** ppv = reinterpret_cast<void**>(object_ptr); *ppv = gptr;</code>
Einschränkungen und Vorbehalte:
Hinweis:
In C 0x wird das Verhalten der Konvertierung eines void* in einen Funktionszeiger bedingt unterstützt.
Das obige ist der detaillierte Inhalt vonWie kann ich ein „void*“ sicher in einen Funktionszeiger in C umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!