Conversión de un void*
a un puntero de función directamente no está permitido (no debe compilarse utilizando ninguno de los moldes) en C++ 98/03. Se admite de forma condicional en C++ 0x (una implementación puede elegir definir el comportamiento y, si lo define, debe hacer lo que el estándar dice que debería hacer. A void*
, como se define en la norma C++ 98/03 , estaba destinado para apuntar a objetos y no para contener punteros a funciones o punteros miembros.
Sabiendo que lo que está haciendo es en gran medida dependiente de la implementación, aquí es una opción que debe recopilar y trabajo (suponiendo 32 punteros de bits, el uso a largo tiempo de 64 bits) en la mayoría de las plataformas, a pesar de que es claramente un comportamiento no definido de acuerdo a la norma:
void *gptr = dlsym(some symbol..) ;
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr)) ;
y aquí es otra opción que se debe recopilar y trabajo, pero Carr IES las mismas advertencias con ella como lo anterior:
fptr my_ptr = 0;
*reinterpret_cast<void**>(&my_ptr) = gptr;
O, en cámara lenta ...
// 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;
En esencia, aprovecha el hecho de que la dirección del puntero de función es un puntero de objeto [void (*(*object_ptr))()]
- entonces podemos usar reinterpret_cast
para convertirlo a cualquier otro puntero de objeto: como void**
. Luego podemos seguir la dirección hacia atrás (desmarcando el vacío **) al puntero de la función real y almacenar allí el valor del gptr.
yuk - de ninguna manera código bien definido - pero debe hacer lo que espera que haga en la mayoría de las implementaciones.
uf, su formato tienen desordenar. –
Realmente tiene que arreglar ese código para que podamos leerlo. ¿Qué pasa con las barras diagonales? ¿Estás intentando escribir my_fptr = static_cast (gptr)? –
Se solucionó el problema de formato. En lugar de usar las etiquetas HTML, use los botones de formato que están disponibles. – Naveen