Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menukar Penunjuk kepada Integer dengan Selamat untuk Keserasian 64-Bit?

Bagaimana untuk Menukar Penunjuk kepada Integer dengan Selamat untuk Keserasian 64-Bit?

Susan Sarandon
Susan Sarandonasal
2024-11-17 06:06:04839semak imbas

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

Menukar Penunjuk kepada Integer untuk Keserasian 64-Bit

Pangkalan kod sedia ada, pada asalnya direka untuk mesin 32-bit, menggunakan fungsi dengan hujah void* yang kemudiannya ditukar kepada jenis yang sesuai dalam fungsi:

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

Apabila menyesuaikan kod ini kepada persekitaran 64-bit, pengkompil membenderakan ralat:

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

Untuk menangani perkara ini, pengubahsuaian diperlukan yang mengekalkan keserasian dengan 32 -mesin bit sebagai baiklah.

Penyelesaian

Untuk pendekatan C moden, reinterpret_cast berfungsi sebagai mekanisme penukaran yang ideal. Kod berubah seperti berikut:

#include <cstdint>

void *p;
auto i = reinterpret_cast<std::uintptr_t>(p);

Jenis Integer Betul untuk Storan Penunjuk

Jenis data yang disyorkan untuk menyimpan penunjuk sebagai integer ialah uintptr_t atau intptr_t. Jenis ini berada dalam pengepala untuk C99 dan ruang nama std untuk C 11.

Operator Casting yang Sesuai

Dalam C , reinterpret_cast ialah mekanisme casting pilihan untuk penukaran ini. Ia menggantikan operator cast gaya C, yang tidak lagi digemari dalam C .

Atas ialah kandungan terperinci Bagaimana untuk Menukar Penunjuk kepada Integer dengan Selamat untuk Keserasian 64-Bit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn