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
Susan Sarandonasal
2024-12-05 05:22:14166semak imbas

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;
}

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

struct Blah

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