Maison > Article > développement back-end > Comment puis-je convertir en toute sécurité un « void* » en un pointeur de fonction en C ?
Casting de pointeur de fonction en C
En C , la conversion directe d'un void* en pointeur de fonction n'est généralement pas autorisée. Cependant, quelques approches peuvent fonctionner en fonction de l'implémentation et de la plate-forme.
Méthode 1 (comportement non défini) :
Cette méthode implique un double reinterpret_casting :
<code class="cpp">void *gptr = dlsym(some symbol..); typedef void (*fptr)(); fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>
Méthode 2 (évite la conversion directe) :
Cette méthode utilise une étape intermédiaire pour stocker l'adresse du pointeur de fonction dans une variable :
<code class="cpp">fptr my_ptr = 0; reinterpret_cast<void*&>(my_ptr) = gptr;</code>
Version plus lente mais plus transparente de la méthode 2 :
<code class="cpp">void (**object_ptr)() = &my_ptr; void ** ppv = reinterpret_cast<void**>(object_ptr); *ppv = gptr;</code>
Limitations et mises en garde :
Remarque :
En C 0x, le comportement de conversion d'un void* en pointeur de fonction est pris en charge sous condition.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!