Compartir a través de


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.

Archivos de inclusión

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 el 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 la compatibilidad de tipos con los tipos de datos de 32 bits. Los nuevos tipos proporcionan exactamente la misma escritura que los tipos existentes, al mismo tiempo que proporcionan compatibilidad con Windows de 64 bits. Para obtener más información, vea El nuevo tipo de datos o el archivo de encabezado Basetsd.h.

Macros predefinidas

El compilador define las macros siguientes 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 lo define 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 del asistente

Las siguientes funciones insertadas (definidas en Basetsd.h) pueden ayudarle a convertir valores de forma segura 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 sign-extends the int value, UIntToPtr zero-extends the unsigned int value, LongToPtr sign-extends the long value, and ULongToPtr zero-extends the unsigned long value.

Compilador de 64 bits

Los compiladores de 64 bits se pueden usar para identificar el truncamiento del puntero, conversiones de tipos incorrectas y otros problemas específicos de 64 bits.

Cuando se ejecuta por primera vez el compilador, probablemente generará muchas advertencias de truncamiento de 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 truncamiento 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 de 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: Pasar longitud cero. Por ejemplo, pasando 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: Llamada a la familia printf de funciones 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 del 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 se compila para Windows de 64 bits.