Das Ziel besteht darin, einen Void-Zeiger über dlsym() zu erhalten Rufen Sie die Funktion auf, auf die dieser Zeiger verweist. Die versuchte Konvertierung durch Casting mittels static_cast oder reinterpret_cast ist im Gegensatz zu einem C-Style-Cast fehlgeschlagen.
Die direkte Konvertierung eines Void-Zeigers in einen Funktionszeiger ist in C 98/03 unzulässig. C 0x bietet jedoch bedingte Unterstützung, sodass eine Implementierung das Verhalten bestimmen kann.
Undefinierter Verhaltensansatz:
Der folgende Code ist zwar nicht durch den Standard definiert, funktioniert jedoch möglicherweise weiter die meisten Plattformen:
<code class="cpp">void *gptr = dlsym(some symbol..); typedef void (*fptr)(); fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>
Alternativ:
<code class="cpp">fptr my_ptr = 0; reinterpret_cast<void*&>(my_ptr) = gptr;</code>
Komplexer, aber tragbarer Ansatz:
Diese Methode nutzt die Tatsache aus, dass die Adresse eines Funktionszeigers ist ein Objektzeiger:
<code class="cpp">// Get address as object pointer void (**object_ptr)() = &my_ptr; // Convert to void** (also an object pointer) void **ppv = reinterpret_cast<void**>(object_ptr); // Store address from 'gptr' in memory cell pointed to by 'ppv' *ppv = gptr;</code>
Dieser Ansatz bleibt im Standard undefiniert, sollte aber bei den meisten Implementierungen einigermaßen gut funktionieren.
Das obige ist der detaillierte Inhalt vonKann C einen Void-Zeiger in einen Funktionszeiger umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!