Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tema se describen las herramientas disponibles para su uso en la preparación de la aplicación de 64 bits. Windows 10 está disponible para procesadores basados en x64 y ARM64.
Incluir archivos
Los elementos de API son prácticamente idénticos entre Windows de 32 y 64 bits. Los archivos de encabezado de Windows se han modificado para que se puedan usar para código de 32 y 64 bits. Los nuevos tipos y macros de 64 bits se definen en un nuevo archivo de encabezado, Basetsd.h, que se encuentra en el conjunto de archivos de encabezado incluidos por Windows.h. Basetsd.h incluye las nuevas definiciones de tipo de datos para ayudar a hacer que el tamaño de palabra del código fuente sea independiente.
Nuevos tipos de datos
Los archivos de encabezado de Windows contienen nuevos tipos de datos. Estos tipos son principalmente para asegurar la compatibilidad con los tipos de datos de 32 bits. Los nuevos tipos proporcionan exactamente la misma escritura que los tipos existentes, mientras que al mismo tiempo proporcionan compatibilidad con Windows de 64 bits. Para obtener más información, vea The New Data Types o el archivo de encabezado Basetsd.h.
Macros predefinidas
El compilador define las siguientes macros para identificar la plataforma.
Macro | Significado |
---|---|
_WIN64 | Una plataforma de 64 bits. Esto incluye x64 y ARM64. |
_WIN32 | Una plataforma de 32 bits. Este valor también se define mediante el compilador de 64 bits para la compatibilidad con versiones anteriores. |
_WIN16 | Una plataforma de 16 bits |
Las macros siguientes son específicas de la arquitectura.
Macro | Significado |
---|---|
_M_IA64 | Plataforma Intel Itanium |
_M_IX86 | Plataforma x86 |
_M_X64 | Plataforma x64 |
_M_ARM64 | Plataforma ARM64 |
No use estas macros excepto con código específico de la arquitectura, en su lugar, use _WIN64, _WIN32 y _WIN16 siempre que sea posible.
Funciones auxiliares
Las siguientes funciones insertadas (definidas en Basetsd.h) pueden ayudarle a convertir de forma segura valores de un tipo a otro.
void * Handle64ToHandle( const void * POINTER_64 h )
void * POINTER_64 HandleToHandle64( const void *h )
long HandleToLong( const void *h )
unsigned long HandleToUlong( const void *h )
void * IntToPtr( const int i )
void * LongToHandle( const long h )
void * LongToPtr( const long l )
void * Ptr64ToPtr( const void * POINTER_64 p )
int PtrToInt( const void *p )
long PtrToLong( const void *p )
void * POINTER_64 PtrToPtr64( const void *p )
short PtrToShort( const void *p )
unsigned int PtrToUint( const void *p )
unsigned long PtrToUlong( const void *p )
unsigned short PtrToUshort( const void *p )
void * UIntToPtr( const unsigned int ui )
void * ULongToPtr( const unsigned long ul )
Advertencia
IntToPtr extiende el signo del valor int, UIntToPtr extiende el cero del valor unsigned int, LongToPtr extiende el signo del valor long y ULongToPtr extiende el cero del valor unsigned long.
Compilador de 64 bits
Los compiladores de 64 bits se pueden usar para identificar truncamientos de punteros, conversiones de tipos incorrectas y otros problemas específicos de 64 bits.
Cuando el compilador se ejecuta por primera vez, probablemente generará muchas advertencias de truncamiento del puntero o de error de coincidencia de tipos, como las siguientes:
warning C4311: 'type cast' : pointer truncation from 'unsigned char *' to 'unsigned long '
Use estas advertencias como guía para que el código sea más sólido. Se recomienda eliminar todas las advertencias, especialmente las advertencias de truncamientos de puntero.
Modificadores y advertencias del compilador de 64 bits
Tenga en cuenta que este compilador habilita el modelo de datos LLP64.
Hay una opción de advertencia para ayudar a migrar a LLP64. El modificador -Wp64 -W3 habilita las siguientes advertencias:
- C4305: advertencia de truncamiento. Por ejemplo, "return": truncamiento de "unsigned int64" a "long".
- C4311: advertencia de truncamiento. Por ejemplo, "type cast": truncamiento del puntero de "int*_ptr64" a "int".
- C4312: conversión a advertencia de mayor tamaño. Por ejemplo, "type cast": conversión de "int" a "int*_ptr64" de mayor tamaño.
- C4318: pasando longitud cero. Por ejemplo, pasar constante cero como longitud a la función memset.
- C4319: operador Not. Por ejemplo, "~": cero que extiende "unsigned long" a "unsigned _int64" de mayor tamaño.
- C4313: llamar a la familia de funciones printf con especificadores y argumentos de tipo de conversión en conflicto. Por ejemplo, "printf": "%p" en la cadena de formato entra en conflicto con el argumento 2 de tipo "_int64". Otro ejemplo es la llamada printf("%x", pointer_value); esto provoca un truncamiento de los 32 bits superiores. La llamada correcta es printf("%p", pointer_value).
- C4244: igual que la advertencia C4242 existente. Por ejemplo, "return": conversión de "_int64" a "unsigned int", posible pérdida de datos.
Enlazador y bibliotecas de 64 bits
Para compilar aplicaciones, use el enlazador y las bibliotecas proporcionadas por Windows SDK. La mayoría de las bibliotecas de 32 bits tienen una versión de 64 bits correspondiente, pero algunas bibliotecas heredadas solo están disponibles en versiones de 32 bits. El código que llama a estas bibliotecas no se vinculará cuando la aplicación esté compilada para Windows de 64 bits.