"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 > Pouvez-vous convertir des pointeurs vides en pointeurs de fonction en C++ ?

Pouvez-vous convertir des pointeurs vides en pointeurs de fonction en C++ ?

Publié le 2024-11-08
Parcourir:918

Can You Cast void Pointers to Function Pointers in C  ?

Casting de pointeurs vides en pointeurs de fonction en C

La conversion des pointeurs vides renvoyés par des fonctions comme dlsym() en pointeurs de fonction n'est pas simple en C . Par défaut, une telle conversion directe est interdite dans C 98/03.

Raison de la restriction

Dans C 98/03, les pointeurs void* étaient destinés à référencer des objets, pas de pointeurs de fonction ou de membre.

Prise en charge conditionnelle en C 0x

En C 0x, la conversion de void* en pointeurs de fonction est facultativement prise en charge par les implémentations. S'il est pris en charge, le comportement doit être conforme à la norme.

Solutions de contournement dépendantes de la mise en œuvre

Bien que la diffusion directe ne soit pas autorisée, ces solutions de contournement peuvent fonctionner sur la plupart des plates-formes :

  • Réinterpréter la diffusion :
fptr my_fptr = reinterpret_cast(reinterpret_cast(gptr));
  • Réinterprétation des variables :
fptr my_ptr = 0;
reinterpret_cast(my_ptr) = gptr;

Ces solutions de contournement exploitent le fait que les adresses de pointeurs de fonction sont des objets et peuvent être converties en pointeurs void** à l'aide de reinterpret_cast.

Remarque d'avertissement

Ces solutions de contournement impliquent un comportement non défini et doivent être utilisées avec discrétion.

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