Heim >Backend-Entwicklung >C++ >Wie kann ich ein „void*' sicher in einen Funktionszeiger in C umwandeln?

Wie kann ich ein „void*' sicher in einen Funktionszeiger in C umwandeln?

DDD
DDDOriginal
2024-11-03 01:36:02598Durchsuche

How Can I Safely Cast a `void*` to a Function Pointer in C  ?

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:

  • Diese Methoden sind Implementierungs- abhängig und ihr Verhalten wird nicht durch den C-Standard garantiert.
  • Sie können auf einigen Plattformen oder bei bestimmten Compilern undefiniertes Verhalten verursachen.
  • Es wird empfohlen, immer die Gültigkeit des Zeigers zu überprüfen, bevor Sie ihn verwenden als Funktionszeiger.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn