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

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

Susan Sarandon
Lepaskan: 2024-12-05 05:22:14
asal
239 orang telah melayarinya

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

GCC's typeid.name() Keanehan

Fungsi typeid.name() sering digunakan untuk mendapatkan maklumat tentang jenis pembolehubah atau ungkapan. Walau bagaimanapun, apabila menyusun dengan GCC, telah diperhatikan bahawa fungsi ini mengembalikan aksara yang kelihatan tidak masuk akal dan bukannya nama jenis yang tidak dicacatkan yang dijangkakan. Tingkah laku ini berbeza dengan penyusun lain seperti Visual C , yang memberikan gambaran yang lebih jelas.

Punca Disebalik Percanggahan

Percanggahan terletak pada pelaksanaan typeid. name(), yang ditakrifkan oleh pelaksanaan pengkompil. GCC, misalnya, mengembalikan nama yang dihias, yang merangkumi maklumat tambahan tentang jenis, seperti nama dan tandatangan pembina dan pemusnah.

Menyahlemahkan Nama yang Dihiasi

Untuk mendapatkan nama jenis yang lebih mudah dibaca daripada rentetan yang dihias, anda boleh menggunakan alatan seperti c filt atau __cxa_demangle. Alat ini "menghancurkan" nama yang dihias, mengalih keluar maklumat tambahan dan meninggalkan anda dengan nama jenis yang tidak rosak.

Contoh: Demangling dengan penapisan c

#include <iostream>
#include <typeinfo>

using namespace std;

struct Blah {};

int main() {
  cout << c++filt::demangle(typeid(Blah).name()) << endl;
  return 0;
}
Salin selepas log masuk

Apabila anda menyusun dan melaksanakan kod yang diubah suai ini, anda akan mendapat yang diingini output:

struct Blah
Salin selepas log masuk

Kesimpulan

Walaupun fungsi typeid.name() GCC pada mulanya mengembalikan nama jenis yang dihias, ia adalah mungkin untuk demangle untuk mendapatkan jenis unmalled nama menggunakan alatan seperti c filt atau __cxa_demangle. Dengan memahami sifat yang ditentukan pelaksanaan typeid.name(), anda boleh mendapatkan semula maklumat jenis yang diingini dalam kod C anda dengan berkesan.

Atas ialah kandungan terperinci Mengapakah `typeid.name()` GCC Mengembalikan Nama Tidak Boleh Dibaca dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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