Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Après avoir converti votre code source de pilote 32 bits pour utiliser les nouveaux types de données, vous pouvez utiliser le compilateur 64 bits pour identifier les problèmes liés au type que vous avez initialement manqués. La première fois que vous compilez ce code pour Windows 64 bits, le compilateur peut générer de nombreux avertissements de troncation de pointeur ou de incompatibilité de type. Utilisez ces avertissements comme guide pour rendre votre code plus robuste. Une bonne pratique consiste à éliminer tous les avertissements, en particulier les avertissements de troncature de pointeur.
Voici un exemple d’avertissement de ce type :
warning C4311: 'type cast' : pointer truncation from 'unsigned char *' to 'unsigned long '
Par exemple, le code suivant peut générer l’avertissement C4311 :
buffer = (PUCHAR)srbControl;
(ULONG)buffer += srbControl->HeaderLength;
Pour corriger le code, apportez les modifications suivantes :
buffer = (PUCHAR)srbControl;
(ULONG_PTR)buffer += srbControl->HeaderLength;
Macros prédéfinies
Le compilateur définit les macros suivantes pour identifier la plateforme.
| Macro | Sens |
|---|---|
_WIN64 |
Plateforme 64 bits. |
_WIN32 |
Plateforme 32 bits. Cette valeur est également définie par le compilateur 64 bits pour la compatibilité descendante. |
_WIN16 |
Plateforme 16 bits. |
Les macros suivantes sont spécifiques à l’architecture.
| Macro | Sens |
|---|---|
_M_IA64 |
Plateforme Intel 64 bits. |
_M_IX86 |
Plateforme Intel 32 bits. |
N’utilisez pas ces macros, sauf avec du code spécifique à l’architecture. Utilisez plutôt _WIN64, _WIN32 et _WIN16 dans la mesure du possible.
Options et avertissements du compilateur 64 bits
Il existe une option d’avertissement pour faciliter le portage vers Windows 64 bits. Le commutateur -Wp64-W3 active les avertissements suivants :
C4305 : avertissement de troncation. Par exemple, « return » : troncature de « unsigned int64 » en « long ».
C4311 : avertissement de troncation. Par exemple, « type cast » : troncature du pointeur de « int*_ptr64 » à « int ».
C4312 : Conversion en avertissement de taille plus grande. Par exemple, « type cast » : conversion de « int » en « int*_ptr64 » de taille supérieure.
C4318 : Passage de la longueur zéro. Par exemple, en passant une constante zéro comme longueur à la fonction memset.
C4319 : Non opérateur. Par exemple, « ~ » : extension nulle de « unsigned long » vers « unsigned _int64 » de taille supérieure.
C4313 : Appel de la famille printf de fonctions avec des spécificateurs et des arguments de type de conversion en conflit. Par exemple, « printf » : «%p» dans la chaîne de format est en conflit avec l’argument 2 de type « _int64 ». Un autre exemple est l’appel printf( »%x« , pointer_value) ; cela provoque une troncation des 32 bits supérieurs. L’appel correct est printf( »%p« , pointer_value).
C4244 : identique à l’avertissement C4242 existant. Par exemple, « return » : conversion de « _int64 » en « int non signé », perte possible de données.