Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah saya boleh demangle std::type_info::name untuk mendedahkan jenis asas dalam C ?

Bagaimanakah saya boleh demangle std::type_info::name untuk mendedahkan jenis asas dalam C ?

Barbara Streisand
Lepaskan: 2024-12-10 11:38:11
asal
402 orang telah melayarinya

How can I demangle std::type_info::name to reveal the underlying type in C  ?

De-Mangler for std::type_info::name: Menyingkap Nama Yang Ditakrifkan

Nama yang dirosakkan oleh std::type_info kekal misteri , menjadikannya mencabar untuk memahami jenis asas. Pencarian untuk penyelesaian yang merungkai enigma ini telah membawa kepada penerokaan pelbagai pendekatan.

Merungkai Nama Yang Dicemari

Satu penyelesaian memanfaatkan ciri berkuasa C 11 dan g ' s perpustakaan libstdc melalui fungsi abi::__cxa_demangle. Fungsi ini menyahkod nama hancur, mengembalikan rentetan yang boleh dibaca manusia.

Pelaksanaan C 11

Dalam pelaksanaan C 11, fungsi demangle disertakan dalam "jenis .hpp" fail pengepala dan logik demangling sebenar berada dalam "type.cpp." Coretan kod berikut menggambarkan:

#include "type.hpp"

std::string demangle(const char* name) {

    int status = -4; 
    std::unique_ptr<char, void(*)(void*)> res {
        abi::__cxa_demangle(name, NULL, NULL, &status),
        std::free
    };

    return (status==0) ? res.get() : name ;
}
Salin selepas log masuk

Versi Serasi C 98

Bagi mereka yang tidak menggunakan C 11, alternatif masih tersedia. Pelaksanaan serasi C 98 dalam "type.cpp" menggunakan teknik yang berbeza untuk menyahmakan nama:

#include "type.hpp"

struct handle {
    char* p;
    handle(char* ptr) : p(ptr) { }
    ~handle() { std::free(p); }
};

std::string demangle(const char* name) {

    int status = -4; 
    handle result( abi::__cxa_demangle(name, NULL, NULL, &status) );

    return (status==0) ? result.p : name ;
}
Salin selepas log masuk

Penggunaan dan Pertimbangan

Nama demangled boleh diambil semula menggunakan fungsi jenis, yang menerima rujukan kepada jenis yang akan dimusnahkan. Kod berikut menunjukkan penggunaannya:

#include "type.hpp"
struct Base { virtual ~Base() {} };
struct Derived : public Base { };

int main() {
    Base* ptr_base = new Derived();
    std::cout << "Type of ptr_base: " << type(ptr_base) << std::endl;
    std::cout << "Type of pointee: " << type(*ptr_base) << std::endl;
    delete ptr_base;
}
Salin selepas log masuk

Kesimpulan

Dengan teknik ini, pembangun kini boleh mendedahkan identiti tersembunyi nama jenis rosak, memperoleh pemahaman yang lebih jelas tentang jenis yang terlibat dalam kod mereka.

Atas ialah kandungan terperinci Bagaimanakah saya boleh demangle std::type_info::name untuk mendedahkan jenis asas dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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