Conversion d'un pointeur en entier : revisité pour les machines 64 bits
En C/C, un piège potentiel lorsqu'on traite du 64-Bit 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 résoudre ce problème et garantir une compatibilité transparente sur les systèmes 32 bits et 64 bits, une approche C moderne est recommandée :
#includevoid *p; auto i = reinterpret_cast<:uintptr_t>(p);
Choisir le type de données correct
Lors du stockage d'un pointeur sous forme d'entier, il est crucial de sélectionner le type de données approprié. A cet effet, le type uintptr_t est le plus adapté.
// C 11 std::uintptr_t i; // C 03 extern "C" { #include} uintptr_t i; // C99 #include uintptr_t i;
Employer le bon opérateur de diffusion
En C , différents types de conversions existent. Pour ce scénario spécifique, reinterpret_cast est le choix le plus approprié.
// C 11 auto i = reinterpret_cast<:uintptr_t>(p); // C 03 uintptr_t i = reinterpret_cast(p); // C uintptr_t i = (uintptr_t)p;
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3