Maison > développement back-end > C++ > Comment puis-je convertir en toute sécurité un « void* » en un pointeur de fonction en C ?

Comment puis-je convertir en toute sécurité un « void* » en un pointeur de fonction en C ?

DDD
Libérer: 2024-11-03 01:36:02
original
600 Les gens l'ont consulté

How Can I Safely Cast a `void*` to a Function Pointer in C  ?

Casting de pointeur de fonction en C

En C , la conversion directe d'un void* en pointeur de fonction n'est généralement pas autorisée. Cependant, quelques approches peuvent fonctionner en fonction de l'implémentation et de la plate-forme.

Méthode 1 (comportement non défini) :

Cette méthode implique un double reinterpret_casting :

<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

Méthode 2 (évite la conversion directe) :

Cette méthode utilise une étape intermédiaire pour stocker l'adresse du pointeur de fonction dans une variable :

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

Version plus lente mais plus transparente de la méthode 2 :

<code class="cpp">void (**object_ptr)() = &my_ptr;

void ** ppv = reinterpret_cast<void**>(object_ptr);

*ppv = gptr;</code>
Copier après la connexion

Limitations et mises en garde :

  • Ces méthodes sont des implémentations- dépendants et leur comportement n'est pas garanti par le standard C.
  • Ils peuvent provoquer un comportement indéfini sur certaines plateformes ou avec certains compilateurs.
  • Il est recommandé de toujours vérifier la validité du pointeur avant de l'utiliser comme pointeur de fonction.

Remarque :

En C 0x, le comportement de conversion d'un void* en pointeur de fonction est pris en charge sous condition.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal