Apabila bekerja dengan maklumat jenis dalam C , typeid.name() ialah alat yang berguna untuk mendapatkan nama jenis. Walau bagaimanapun, menggunakan GCC, pembangun telah menemui watak yang membingungkan dalam outputnya. Artikel ini menyelidiki sebab di sebalik gelagat ini dan meneroka cara mendapatkan nama jenis yang tidak rosak.
Secara lalai, GCC mengembalikan "nama berhias" untuk jenis, yang merangkumi maklumat tambahan dan tidak boleh dibaca oleh manusia. Ini ditunjukkan dalam coretan kod yang disediakan:
#include <iostream> #include <typeinfo> struct Blah {}; int main() { cout << typeid(Blah).name() << endl; return 0; }
Apabila disusun dengan GCC, kod tersebut mengeluarkan "4Blah" dan bukannya "Blah" yang dijangkakan. Ini kerana GCC telah menambahkan maklumat berkaitan jenis pada nama, seperti parameter dan saiz.
Untuk mendapatkan nama unmalled, kita perlu menggunakan proses yang dipanggil "demangling ." GCC menyediakan fungsi __cxa_demangle() untuk tujuan ini, serta penapisan c alat baris perintah.
Kod berikut menunjukkan cara menyahmangle nama yang dihias:
#include <iostream> #include <typeinfo> int main() { const char* decorated_name = typeid(Blah).name(); char* unmangled_name = abi::__cxa_demangle(decorated_name, nullptr, nullptr, nullptr); // Windows: _ZNKSt7__cxxabiv117__class_type_info9can_catchEPv if (unmangled_name) { cout << unmangled_name << endl; free(unmangled_name); } else { cout << "Demangling failed" << endl; } return 0; }
Apabila disusun dengan GCC, kod ini kini akan mengeluarkan "Blah", sebagai dijangka.
Walaupun typeid.name() ialah alat yang berharga untuk mendapatkan maklumat jenis dalam C , adalah penting untuk memahami cara GCC mangles menaip nama. Dengan memanfaatkan teknik demangling yang diterangkan di atas, pembangun boleh mengekstrak nama jenis yang boleh dibaca manusia, memudahkan penyahpepijatan dan analisis.
Atas ialah kandungan terperinci Mengapakah `typeid.name()` GCC Mengembalikan Nama Jenis Pelik dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!