Rumah > pembangunan bahagian belakang > C++ > 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
Lepaskan: 2024-11-17 06:06:04
asal
918 orang telah melayarinya

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;
        // ...
    }
}
Salin selepas log masuk

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

error: cast from 'void*' to 'int' loses precision
Salin selepas log masuk

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);
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan