„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Kann C++ einen Void-Zeiger in einen Funktionszeiger konvertieren?

Kann C++ einen Void-Zeiger in einen Funktionszeiger konvertieren?

Veröffentlicht am 12.11.2024
Durchsuche:818

Can C   Convert a Void Pointer to a Function Pointer?

Void-Zeiger in Funktionszeiger umwandeln: Eine bedingte Möglichkeit in C

Problem

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.

Antwort

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 im Standard nicht definiert, funktioniert jedoch möglicherweise weiter die meisten Plattformen:

void *gptr = dlsym(some symbol..);
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast(reinterpret_cast(gptr));

Alternativ:

fptr my_ptr = 0;
reinterpret_cast(my_ptr) = gptr;

Komplexer, aber tragbarer Ansatz:

Diese Methode nutzt die Tatsache aus, dass die Adresse eines Funktionszeigers ein Objektzeiger ist:

// Get address as object pointer
void (**object_ptr)() = &my_ptr;

// Convert to void** (also an object pointer)
void **ppv = reinterpret_cast(object_ptr);

// Store address from 'gptr' in memory cell pointed to by 'ppv'
*ppv = gptr;

Dieser Ansatz bleibt im Standard undefiniert, sollte aber bei den meisten Implementierungen einigermaßen gut funktionieren.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3