Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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.