Maison  >  Article  >  développement back-end  >  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
DDDoriginal
2024-11-03 01:36:02467parcourir

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>

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>

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>

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!

Déclaration:
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