Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Menghancurkan Nama Jenis C Mangled daripada `std::type_info`?

Bagaimanakah Saya Boleh Menghancurkan Nama Jenis C Mangled daripada `std::type_info`?

Mary-Kate Olsen
Lepaskan: 2024-12-27 20:25:10
asal
236 orang telah melayarinya

How Can I Demangle Mangled C   Type Names from `std::type_info`?

Mentafsir Nama Enigmatik daripada std::type_info

Dalam alam C , std::type_info memberikan cerapan penting tentang jenis entiti, yang dicontohkan oleh kelas contoh atau fungsi. Walau bagaimanapun, perwakilan yang rosak bagi nama jenis ini sering mengaburkan identiti sebenarnya. Contohnya, typeid(std::vector).name() menghasilkan "St6vectorIiSaIiEE", menjadikannya hanya boleh ditafsirkan oleh akal yang cerdik atau algoritma misterius.

Merungkai Misteri

Untuk menjinakkan binatang yang hancur ini, kami membentangkan penyelesaian yang menggunakan demangling yang menggerunkan keupayaan std::demangle, alat yang berkuasa untuk mendedahkan bentuk asas yang boleh dibaca manusia. Berikut ialah panduan langkah demi langkah untuk menggunakan penyelesaian ini:

  1. type.hpp: Wujudkan fail pengepala asas dengan pengisytiharan berikut:
#include <string>
#include <typeinfo>

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

template <class T>
std::string type(const T& t) {
    return demangle(typeid(t).name());
}
Salin selepas log masuk
  1. type.cpp (C 11): Gunakan ciri C 11 untuk operasi demangling yang cekap:

    #ifdef __GNUG__
    #include <cstdlib>
    #include <memory>
    #include <cxxabi.h>
    
    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 ;
    }
    
    #else
    std::string demangle(const char* name) {
    return name;
    }
    #endif
    Salin selepas log masuk
  2. type.cpp (C 98): Sediakan penyelesaian alternatif untuk sistem tanpa C 11 ciri:

    #ifdef __GNUG__
    #include <cstdlib>
    #include <memory>
    #include <cxxabi.h>
    
    struct handle {
    char* p;
    handle(char* ptr) : p(ptr) { }
    ~handle() { std::free(p); }
    };
    
    std::string demangle(const char* name) {
    
    int status = -4; // some arbitrary value to eliminate the compiler warning
    
    handle result( abi::__cxa_demangle(name, NULL, NULL, &status) );
    
    return (status==0) ? result.p : name ;
    }
    
    #else
    
    // does nothing if not g++
    std::string demangle(const char* name) {
    return name;
    }
    
    #endif
    Salin selepas log masuk
  3. Penggunaan: Sepadukan penyelesaian ke dalam kod anda untuk mengekstrak nama jenis yang boleh dibaca manusia dengan mudah:

    #include <iostream>
    #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

Menggunakan pendekatan ini, output berikut ialah dihasilkan:

Type of ptr_base: Base*
Type of pointee: Derived
Salin selepas log masuk

Keserasian dan Kaveat:
Penyelesaian yang disediakan telah diuji pada pelbagai platform dan penyusun, termasuk g , clang , dan Mingw32. Walaupun ia kebanyakannya menyasarkan g , versi C 98 boleh digunakan pada sistem bukan g. Adalah penting untuk ambil perhatian bahawa API khusus vendor mungkin berbeza dengan sewajarnya.

Kesimpulannya, penyelesaian demangling ini memberi kuasa kepada anda untuk mengeluarkan nama jenis yang boleh dibaca manusia dengan mudah daripada std::type_info, menghapuskan kekaburan yang dikaitkan dengan perwakilan yang rosak. Dengan memanfaatkan coretan kod yang disediakan, anda boleh menyepadukan dengan lancar keupayaan ini ke dalam projek anda, mempertingkatkan keupayaan penyahpepijatan dan pengelogan dengan jelas dan mudah.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghancurkan Nama Jenis C Mangled daripada `std::type_info`?. 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