Compartir a través de


Las herramientas

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.