Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menghancurkan Nama Jenis C Mangled 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
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:
#include <string> #include <typeinfo> std::string demangle(const char* name); template <class T> std::string type(const T& t) { return demangle(typeid(t).name()); }
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
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
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!