"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > C++ peut-il convertir un pointeur vide en pointeur de fonction ?

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

Publié le 2024-11-12
Parcourir:325

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 :

void *gptr = dlsym(some symbol..);
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast(reinterpret_cast(gptr));

Alternativement :

fptr my_ptr = 0;
reinterpret_cast(my_ptr) = gptr;

Approche complexe mais portable :

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

// Get address as object pointer
void (**object_ptr)() = &my_ptr;

// Convert to void** (also an object pointer)
void **ppv = reinterpret_cast(object_ptr);

// Store address from 'gptr' in memory cell pointed to by 'ppv'
*ppv = gptr;

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

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3