Rumah > pembangunan bahagian belakang > C++ > Mengapakah `typeid.name()` GCC Mengembalikan Nama Jenis Pelik dan Bagaimana Saya Boleh Membetulkannya?

Mengapakah `typeid.name()` GCC Mengembalikan Nama Jenis Pelik dan Bagaimana Saya Boleh Membetulkannya?

DDD
Lepaskan: 2024-11-30 14:59:11
asal
444 orang telah melayarinya

Why Does GCC's `typeid.name()` Return Weird Type Names, and How Can I Fix It?

Menyahmistikan Output Nama Jenis Pelik GCC menggunakan typeid.name()

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.

Misteri Nama Berhias

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;
}
Salin selepas log masuk

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.

Demangling Decorated Names

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;
}
Salin selepas log masuk

Apabila disusun dengan GCC, kod ini kini akan mengeluarkan "Blah", sebagai dijangka.

Kesimpulan

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan