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!