Maison  >  Article  >  développement back-end  >  C peut-il convertir un pointeur vide en pointeur de fonction ?

C peut-il convertir un pointeur vide en pointeur de fonction ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-03 04:42:31756parcourir

Can C   Convert a Void Pointer to a Function Pointer?

Conversion de pointeurs vides en pointeurs de fonction : une possibilité conditionnelle en C

Problème

Obtention d'un pointeur vide via dlsym(), le but est de invoque la fonction référencée par ce pointeur. La tentative de conversion par conversion à l'aide de static_cast ou reinterpret_cast a échoué, contrairement à une conversion de style C.

Réponse

La conversion directe d'un pointeur vide en pointeur de fonction n'est pas autorisée dans C 98/03. Cependant, C 0x offre un support conditionnel, permettant à une implémentation de dicter le comportement.

Approche comportementale non définie :

Bien qu'il ne soit pas défini par la norme, le code suivant peut fonctionner sur la plupart des plateformes :

<code class="cpp">void *gptr = dlsym(some symbol..);
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>

Alternative :

<code class="cpp">fptr my_ptr = 0;
reinterpret_cast<void*&>(my_ptr) = gptr;</code>

Approche complexe mais portable :

Cette méthode exploite le fait que l'adresse d'un pointeur de fonction est un pointeur d'objet :

<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>

Cette approche reste indéfinie dans la norme mais devrait fonctionner raisonnablement bien sur la plupart des implémentations.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn