Maison  >  Article  >  développement back-end  >  Comment convertir en toute sécurité des pointeurs en entiers pour une compatibilité 64 bits ?

Comment convertir en toute sécurité des pointeurs en entiers pour une compatibilité 64 bits ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-17 06:06:04841parcourir

How to Safely Convert Pointers to Integers for 64-Bit Compatibility?

Conversion de pointeurs en entiers pour une compatibilité 64 bits

Une base de code existante, conçue à l'origine pour une machine 32 bits, utilise une fonction avec un argument void* qui est ensuite converti en un type approprié dans la fonction :

void function(MESSAGE_ID id, void* param)
{
    if(id == FOO) {
        int real_param = (int)param;
        // ...
    }
}

Lors de l'adaptation de ce code à un environnement 64 bits, le compilateur signale une erreur :

error: cast from 'void*' to 'int' loses precision

Pour résoudre ce problème, une modification est requise pour maintenir également la compatibilité avec les machines 32 bits.

Solution

Pour une approche C moderne, reinterpret_cast

#include 

void *p;
auto i = reinterpret_cast(p);

Type entier correct pour le stockage des pointeurs

Le type de données recommandé pour stocker les pointeurs sous forme d'entiers est uintptr_t ou intptr_t. Ces types résident dans le répertoire en-tête pour C99 et l'espace de noms std pour C 11.

Opérateur de casting approprié

En C , reinterpret_cast est le mécanisme de casting préféré pour cette conversion. Il remplace l'opérateur de conversion de style C, qui n'est plus favorisé en C .

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn