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
Mary-Kate Olsenasal
2024-12-27 20:25:10240semak imbas

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

Menggunakan pendekatan ini, output berikut ialah dihasilkan:

Type of ptr_base: Base*
Type of pointee: Derived

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!

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