Heim >Backend-Entwicklung >C++ >Können Sie leere Zeiger in Funktionszeiger in C umwandeln?

Können Sie leere Zeiger in Funktionszeiger in C umwandeln?

Barbara Streisand
Barbara StreisandOriginal
2024-11-02 21:20:30505Durchsuche

Can You Cast void Pointers to Function Pointers in C  ?

Void-Zeiger in Funktionszeiger in C umwandeln

Void-Zeiger, die von Funktionen wie dlsym() zurückgegeben werden, in Funktionszeiger umzuwandeln, ist in C nicht einfach . Standardmäßig ist ein solches direktes Casting in C 98/03 verboten.

Grund für die Einschränkung

In C 98/03 waren void*-Zeiger für die Referenzierung von Objekten gedacht, keine Funktions- oder Mitgliedszeiger.

Bedingte Unterstützung in C 0x

In C 0x wird das Umwandeln von void* in Funktionszeiger optional von Implementierungen unterstützt. Wenn unterstützt, muss das Verhalten dem Standard entsprechen.

Implementierungsabhängige Problemumgehungen

Direktes Casting ist zwar nicht zulässig, diese Problemumgehungen funktionieren jedoch möglicherweise auf den meisten Plattformen:

  • Besetzung neu interpretieren:
<code class="cpp">fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>
  • Variable Neuinterpretation:
<code class="cpp">fptr my_ptr = 0;
reinterpret_cast<void*&>(my_ptr) = gptr;</code>

Diese Problemumgehungen nutzen die Tatsache aus, dass Funktionszeigeradressen Objekte sind und mit reinterpret_cast in void**-Zeiger konvertiert werden können.

Vorsichtshinweis

Diese Problemumgehungen beinhalten undefiniertes Verhalten und sollte mit Diskretion verwendet werden.

Das obige ist der detaillierte Inhalt vonKönnen Sie leere Zeiger in 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