Frage:
Sie haben einen void-Zeiger, der von dlsym() zurückgegeben wurde, und Sie Sie müssen die Funktion aufrufen, auf die dieser leere Zeiger zeigt. Sie haben versucht, sowohl mit static_cast als auch mit reinterpret_cast zu konvertieren, aber keines von beiden hat funktioniert. Welche Möglichkeiten haben Sie?
Antwort:
Die direkte Umwandlung eines Void-Zeigers in einen Funktionszeiger ist in C 98/03 nicht zulässig. Es kann in C 0x bedingt unterstützt werden, sein Verhalten ist jedoch durch die Implementierung definiert.
Nicht-Standardlösungen:
Trotz der Mehrdeutigkeit des Standards gibt es mehrere Nicht-Standardlösungen Standardlösungen, die möglicherweise auf den meisten Plattformen funktionieren, obwohl sie als undefiniertes Verhalten gelten:
Option 1:
<code class="cpp">typedef void (*fptr)(); fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>
Option 2:
<code class="cpp">fptr my_fptr = 0; reinterpret_cast<void*&>(my_fptr) = gptr;</code>
Option 3 (Zeitlupe):
<code class="cpp">void (**object_ptr)() = &my_ptr; void **ppv = reinterpret_cast<void**>(object_ptr); *ppv = gptr;</code>
Diese Optionen nutzen die Tatsache aus, dass die Adresse eines Funktionszeigers ein Objektzeiger ist, was indirekte Möglichkeiten ermöglicht Casting mit reinterpret_cast.
Hinweis:
Diese Lösungen funktionieren nicht garantiert auf allen Plattformen und gelten nicht als Standard-C. Die Nutzung erfolgt auf eigene Gefahr.
Das obige ist der detaillierte Inhalt vonWie kann man in C einen Void-Zeiger sicher in einen Funktionszeiger umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!