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

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