Rumah >pembangunan bahagian belakang >C++ >Mengapa Adakah `typeid.name()` Menghasilkan Output Berbeza dalam GCC dan Bagaimana Saya Boleh Menghancurkannya?

Mengapa Adakah `typeid.name()` Menghasilkan Output Berbeza dalam GCC dan Bagaimana Saya Boleh Menghancurkannya?

Susan Sarandon
Susan Sarandonasal
2024-11-21 07:20:10386semak imbas

Why Does `typeid.name()` Produce Different Output in GCC and How Can I Demangle It?

Typeid.name() Gelagat dalam GCC dan Teknik Demangling

Apabila menggunakan operator typeid, pembangun menghadapi perbezaan dalam output typeid. name() bergantung pada pengkompil yang digunakan. Artikel ini meneroka sebab perkara ini berlaku dalam GCC dan cara menyelesaikan isu untuk mencetak nama jenis yang tidak rosak.

GCC lwn. Visual C : Paparan Nama Jenis

Dalam contoh dengan syarat, GCC (versi 4.4.4) mengembalikan "4Blah" apabila memanggil typeid(Blah).name(), manakala Visual C 2008 memaparkan "struct Blah." Percanggahan ini disebabkan oleh pengembalian nama jenis berhias GCC.

Nama Jenis Berhias GCC

Pelaksanaan pengendali typeid tidak ditakrifkan secara seragam. Dalam kes GCC, ia mengembalikan nama jenis yang dihias, yang termasuk maklumat tambahan seperti saiz dan penjajaran jenis.

Nama Berhias yang Tidak Kusut

Untuk mendapatkan semula yang tidak kusut. taip nama, pengguna mesti menyahkan nama yang dihias. Ini boleh dicapai menggunakan pelbagai alatan:

  • arahan penapisan c: Utiliti baris perintah yang menghilangkan nama yang dihias.
  • fungsi__cxa_demangle() : Fungsi C yang melakukan demangling.

Memohon Demangling

Dalam GCC, arahan berikut boleh dilaksanakan untuk demangle nama yang dihias "4Blah" :

g++ -fno-rtti -no-pie -o main main.cpp
./main | c++filt

Arahan ini akan mencetak "struct Blah" sebagai nama jenis demangled. Mengintegrasikan fungsi __cxa_demangle() ke dalam kod anda juga merupakan pilihan untuk menghilangkan nama yang dihias secara pemrograman.

Atas ialah kandungan terperinci Mengapa Adakah `typeid.name()` Menghasilkan Output Berbeza dalam GCC dan Bagaimana Saya Boleh Menghancurkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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