"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Puede C++ convertir un puntero vacío en un puntero de función?

¿Puede C++ convertir un puntero vacío en un puntero de función?

Publicado el 2024-11-12
Navegar:718

Can C   Convert a Void Pointer to a Function Pointer?

Conversión de punteros nulos en punteros de función: una posibilidad condicional en C

Problema

Obtener un puntero nulo a través de dlsym(), el objetivo es invocar la función a la que hace referencia ese puntero. El intento de conversión mediante conversión usando static_cast o reinterpret_cast ha fallado, a diferencia de una conversión estilo C.

Respuesta

La conversión directa de un puntero nulo a un puntero de función no está permitida en C 98/03. Sin embargo, C 0x ofrece soporte condicional, lo que permite que una implementación dicte el comportamiento.

Enfoque de comportamiento indefinido:

Si bien no está definido por el estándar, el siguiente código puede funcionar en la mayoría de las plataformas:

void *gptr = dlsym(some symbol..);
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast(reinterpret_cast(gptr));

Alternativamente:

fptr my_ptr = 0;
reinterpret_cast(my_ptr) = gptr;

Enfoque complejo pero portátil:

Este método explota el hecho de que la dirección de un puntero de función es un puntero de objeto:

// Get address as object pointer
void (**object_ptr)() = &my_ptr;

// Convert to void** (also an object pointer)
void **ppv = reinterpret_cast(object_ptr);

// Store address from 'gptr' in memory cell pointed to by 'ppv'
*ppv = gptr;

Este enfoque sigue sin estar definido en el estándar, pero debería funcionar razonablemente bien en la mayoría de las implementaciones.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3