Compartilhar via


As ferramentas

Este tópico descreve as ferramentas disponíveis para você usar para preparar seu aplicativo de 64 bits. Windows 10 está disponível para processadores baseados em x64 e ARM64.

Arquivos de inclusão

Os elementos de API são praticamente idênticos entre o Windows de 32 e 64 bits. Os arquivos de cabeçalho do Windows foram modificados para que possam ser usados para código de 32 e 64 bits. Os novos tipos e macros de 64 bits são definidos em um novo arquivo de cabeçalho, Basetsd.h, que está no conjunto de arquivos de cabeçalho incluído pelo Windows.h. Basetsd.h inclui as novas definições de tipo de dados para ajudar a tornar o tamanho da palavra do código-fonte independente.

Novos tipos de dados

Os arquivos de cabeçalho do Windows contêm novos tipos de dados. Esses tipos são principalmente para compatibilidade de tipo com os tipos de dados de 32 bits. Os novos tipos fornecem exatamente a mesma digitação que os tipos existentes, ao mesmo tempo em que dão suporte para o Windows de 64 bits. Para obter mais informações, consulte Os Novos Tipos de Dados ou o arquivo de cabeçalho Basetsd.h.

Macros predefinidas

O compilador define as macros a seguir para identificar a plataforma.

Macro Significado
_WIN64 Uma plataforma de 64 bits. Isso inclui x64 e ARM64.
_WIN32 Uma plataforma de 32 bits. Esse valor também é definido pelo compilador de 64 bits para compatibilidade com versões anteriores.
_WIN16 Uma plataforma de 16 bits

As macros a seguir são específicas para a arquitetura.

Macro Significado
_M_IA64 Plataforma Intel Itanium
_M_IX86 Plataforma x86
_M_X64 Plataforma x64
_M_ARM64 Plataforma ARM64

Não use essas macros, exceto com código específico da arquitetura, em vez disso, use _WIN64, _WIN32 e _WIN16 sempre que possível.

Funções auxiliares

As seguintes funções embutidas (definidas em Basetsd.h) podem ajudá-lo a converter valores com segurança de um tipo para outro.

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 )

Aviso

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

Os compiladores de 64 bits podem ser usados para identificar truncamento de ponteiro, conversões de tipo inadequadas e outros problemas específicos de 64 bits.

Quando o compilador for executado pela primeira vez, ele provavelmente gerará muitos avisos de truncamento de ponteiro ou incompatibilidade de tipo, como o seguinte:

warning C4311: 'type cast' : pointer truncation from 'unsigned char *' to 'unsigned long '

Use esses avisos como um guia para tornar o código mais robusto. É uma boa prática eliminar todos os avisos, especialmente avisos de truncamento de ponteiro.

Avisos e opções do compilador de 64 bits

Observe que esse compilador habilita o modelo de dados LLP64.

Há uma opção de aviso para ajudar na portabilidade para LLP64. A opção -Wp64 -W3 habilita os seguintes avisos:

  • C4305: aviso de truncamento. Por exemplo, "return": truncamento de "unsigned int64" para "long".
  • C4311: aviso de truncamento. Por exemplo, "conversão de tipo": truncamento de ponteiro de "int*_ptr64" para "int".
  • C4312: conversão para aviso de tamanho maior. Por exemplo, "conversão de tipo": conversão de "int" para "int*_ptr64" de maior tamanho.
  • C4318: passando comprimento zero. Por exemplo, passando a constante zero como o comprimento para a função memset .
  • C4319: não operador. Por exemplo, "~": zero estendendo "unsigned long" para "unsigned _int64" de maior tamanho.
  • C4313: chamando a família printf de funções com especificadores e argumentos de tipo de conversão conflitantes. Por exemplo, "printf": "%p" na cadeia de caracteres de formato está em conflito com o argumento 2 do tipo "_int64". Outro exemplo é a chamada printf("%x", pointer_value); isso causa um truncamento dos 32 bits superiores. A chamada correta é printf("%p", pointer_value).
  • C4244: o mesmo que o aviso C4242 existente. Por exemplo, "return": conversão de "_int64" para "unsigned int", possível perda de dados.

Vinculador e bibliotecas de 64 bits

Para criar aplicativos, use o vinculador e as bibliotecas fornecidas pelo SDK do Windows. A maioria das bibliotecas de 32 bits tem uma versão de 64 bits correspondente, mas determinadas bibliotecas herdadas estão disponíveis apenas em versões de 32 bits. O código que chama essas bibliotecas não será vinculado quando o aplicativo for criado para o Windows de 64 bits.