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
Barbara Streisandasal
2024-12-10 11:38:11405semak imbas

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 ;
}

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 ;
}

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;
}

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!

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