"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 > ¿Se pueden convertir punteros vacíos en punteros de función en C++?

¿Se pueden convertir punteros vacíos en punteros de función en C++?

Publicado el 2024-11-08
Navegar:303

Can You Cast void Pointers to Function Pointers in C  ?

Convertir punteros nulos en punteros de función en C

Convertir punteros nulos devueltos por funciones como dlsym() en punteros de función no es sencillo en C . De forma predeterminada, dicha conversión directa está prohibida en C 98/03.

Motivo de la restricción

En C 98/03, los punteros void* estaban destinados a hacer referencia a objetos, no funciona ni tiene punteros de miembros.

Soporte condicional en C 0x

En C 0x, las implementaciones admiten opcionalmente la conversión de void* a punteros de función. Si es compatible, el comportamiento debe ajustarse al estándar.

Soluciones alternativas dependientes de la implementación

Aunque no se permite la transmisión directa, estas soluciones alternativas pueden funcionar en la mayoría de las plataformas:

  • Reinterpretar el reparto:
fptr my_fptr = reinterpret_cast(reinterpret_cast(gptr));
  • Reinterpretación de variables:
fptr my_ptr = 0;
reinterpret_cast(my_ptr) = gptr;

Estas soluciones aprovechan el hecho de que las direcciones de los punteros de función son objetos y se pueden convertir en punteros void** usando reinterpret_cast.

Nota de precaución

Estas soluciones implican un comportamiento indefinido y deben usarse con discreción.

Ú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