Compilador de 64 bits

Depois de converter o código-fonte do driver de 32 bits para usar os novos tipos de dados, o compilador de 64 bits pode ser utilizado para identificar problemas de tipo que possam ter passado despercebidos inicialmente. Na primeira vez que você compilar esse código para o Windows de 64 bits, o compilador pode gerar muitos avisos de truncamento de ponteiro ou de incompatibilidade de tipo. Use esses avisos como um guia para tornar seu código mais robusto. É uma boa prática eliminar todos os avisos, especialmente avisos de truncamento de ponteiro.

Veja a seguir um exemplo de tal aviso:

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

Por exemplo, o código a seguir pode gerar o aviso C4311:

buffer = (PUCHAR)srbControl;
(ULONG)buffer += srbControl->HeaderLength;

Para corrigir o código, faça as seguintes alterações:

buffer = (PUCHAR)srbControl;
(ULONG_PTR)buffer += srbControl->HeaderLength;

Macros predefinidas

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

Macro Significado

_WIN64

Uma plataforma de 64 bits.

_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

Uma plataforma Intel de 64 bits.

_M_IX86

Uma plataforma Intel de 32 bits.

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.

Alternadores e avisos do compilador de 64 Bits

Há uma opção de aviso para auxiliar a portabilidade para o Windows de 64 bits. 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 em 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 de tipo de conversão conflitantes e argumentos. Por exemplo, "printf": "%p" na cadeia de caracteres de formato entra 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: Igual ao aviso existente C4242. Por exemplo, "return": conversão de "_int64" para "unsigned int", possível perda de dados.