Conversión de un puntero en un número entero: revisada para máquinas de 64 bits
En C/C, un error potencial al tratar con 64 bits máquinas de bits surge al manipular punteros. Las técnicas de conversión tradicionales, como la que se muestra a continuación, pueden generar errores de precisión:
void function(MESSAGE_ID id, void* param) { if (id == FOO) { int real_param = (int)param; // ... } }
Solución con técnicas de conversión actualizadas
Para rectificar este problema y garantizar una compatibilidad perfecta en sistemas de 32 y 64 bits, se recomienda un enfoque C moderno:
#includevoid *p; auto i = reinterpret_cast<:uintptr_t>(p);
Elegir el tipo de datos correcto
Al almacenar un puntero como un número entero, es crucial seleccionar el tipo de datos apropiado. Para este propósito, el tipo uintptr_t es el más adecuado.
// C 11 std::uintptr_t i; // C 03 extern "C" { #include} uintptr_t i; // C99 #include uintptr_t i;
Emplear el operador de conversión correcto
En C, existen varios tipos de conversiones. Para este escenario específico, reinterpret_cast es la opción más adecuada.
// C 11 auto i = reinterpret_cast<:uintptr_t>(p); // C 03 uintptr_t i = reinterpret_cast(p); // C uintptr_t i = (uintptr_t)p;
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