Conversion d'un pointeur en entier : revisité pour les machines 64 bits
En C/C, un écueil potentiel lorsqu'il s'agit de 64-Bits Les machines à bits surviennent lors de la manipulation des pointeurs. Les techniques de conversion traditionnelles, telles que celle présentée ci-dessous, peuvent entraîner des erreurs de précision :
void function(MESSAGE_ID id, void* param) { if (id == FOO) { int real_param = (int)param; // ... } }
Solution avec des techniques de diffusion mises à jour
Pour corriger ce problème et garantir une conversion transparente compatibilité sur les systèmes 32 bits et 64 bits, une approche C moderne est recommandée :
#include <cstdint> void *p; auto i = reinterpret_cast<std::uintptr_t>(p);
Choisir le type de données correct
Lors du stockage d'un pointeur en tant que un entier, il est crucial de sélectionner le type de données approprié. À cette fin, le type uintptr_t est le plus approprié.
// C++11 std::uintptr_t i; // C++03 extern "C" { #include <stdint.h> } uintptr_t i; // C99 #include <stdint.h> uintptr_t i;
Employer le bon opérateur de casting
En C , différents types de castings existent. Pour ce scénario spécifique, reinterpret_cast est le choix le plus approprié.
// C++11 auto i = reinterpret_cast<std::uintptr_t>(p); // C++03 uintptr_t i = reinterpret_cast<uintptr_t>(p); // C uintptr_t i = (uintptr_t)p;
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!