Maison > développement back-end > C++ > Comment convertir en toute sécurité un pointeur vide vers un pointeur de fonction en C ?

Comment convertir en toute sécurité un pointeur vide vers un pointeur de fonction en C ?

Susan Sarandon
Libérer: 2024-11-05 00:43:02
original
721 Les gens l'ont consulté

How to Safely Cast a Void Pointer to a Function Pointer in C  ?

Casting de pointeur de fonction en C

Question :

Vous avez un pointeur vide renvoyé par dlsym(), et vous besoin d'appeler la fonction pointée par ce pointeur vide. Vous avez essayé de diffuser avec static_cast et reinterpret_cast, mais aucun n'a fonctionné. Quelles options avez-vous ?

Réponse :

La conversion directe d'un pointeur vide en pointeur de fonction est interdite dans C 98/03. Il peut être pris en charge sous condition en C 0x, mais son comportement est défini par l'implémentation.

Solutions non standard :

Malgré l'ambiguïté de la norme, il existe plusieurs solutions non standard. solutions standard qui peuvent fonctionner sur la plupart des plates-formes, bien qu'elles soient considérées comme un comportement non défini :

Option 1 :

<code class="cpp">typedef void (*fptr)();
fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>
Copier après la connexion

Option 2 :

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

Option 3 (Slow Motion) :

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

Ces options exploitent le fait que l'adresse d'un pointeur de fonction est un pointeur d'objet, permettant une casting à l'aide de reinterpret_cast.

Remarque :

Ces solutions ne sont pas garanties de fonctionner sur toutes les plates-formes et ne sont pas considérées comme la norme C . Utilisez-les à vos propres risques.

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