Conversion d'un void*
à un pointeur de fonction directement n'est pas autorisé (ne devrait pas compiler en utilisant l'un des moulages) en C++ 98/03. Il est supporté sous condition en C++ 0x (une implémentation peut choisir de définir le comportement et si elle le définit, elle doit faire ce que la norme dit qu'elle devrait faire.) void*
, comme défini par la norme C++ 98/03 Nous voulions pointer vers des objets et ne pas contenir de pointeurs de fonction ou de membres
Sachant que ce que vous faites est fortement dépendant de l'implémentation, voici une option qui devrait compiler et fonctionner (en supposant que les pointeurs 32 bits, utilisent long long 64 bits) sur la plupart des plates-formes, même si ce comportement est clairement définie selon la norme:
void *gptr = dlsym(some symbol..) ;
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr)) ;
et est une autre option ici qui devrait compiler et le travail, mais carr s les mêmes mises en garde avec elle comme ci-dessus:
fptr my_ptr = 0;
*reinterpret_cast<void**>(&my_ptr) = gptr;
Ou, en mouvement lent ...
// get the address which is an object pointer
void (*(*object_ptr))() = &my_ptr;
// convert it to void** which is also an object pointer
void ** ppv = reinterpret_cast<void**>(object_ptr);
// assign the address in the memory cell named by 'gptr'
// to the memory cell that is named by 'my_ptr' which is
// the same memory cell that is pointed to
// by the memory cell that is named by 'ppv'
*ppv = gptr;
Il exploite essentiellement le fait que l'adresse du pointeur de fonction est un pointeur d'objet [void (*(*object_ptr))()]
- nous pouvons donc utiliser reinterpret_cast
pour le convertir en n'importe quel autre pointeur d'objet: tel que void**
. Nous pouvons ensuite suivre l'adresse (en déréférenciant le vide **) au pointeur de fonction réel et y stocker la valeur du gptr. Yu - en aucun cas un code bien défini - mais il devrait faire ce que vous attendez de lui pour la plupart des implémentations.
ugh, la mise en forme ont gâcher. –
Vous devez vraiment corriger ce code pour pouvoir le lire. Qu'est-ce qui se passe avec les barres obliques? Essayez-vous de taper my_fptr = static_cast (gptr)? –
Correction du problème de formatage. Au lieu d'utiliser les balises HTML, utilisez les boutons de formatage disponibles. – Naveen