Maison > développement back-end > C++ > 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
Libérer: 2024-11-03 04:42:31
original
800 Les gens l'ont consulté

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>
Copier après la connexion

Alternative :

<code class="cpp">fptr my_ptr = 0;
reinterpret_cast<void*&>(my_ptr) = gptr;</code>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal