Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `typeid.name()` GCC Mengembalikan Nama-nama yang Dicemari Daripada Nama Jenis Biasa?

Mengapakah `typeid.name()` GCC Mengembalikan Nama-nama yang Dicemari Daripada Nama Jenis Biasa?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-22 11:50:12759semak imbas

Why Does GCC's `typeid.name()` Return Mangled Names Instead of Plain Type Names?

Nama Jenis Kusut GCC: Menyahmistifikasikan 'typeid.name()' Conundrum

Apabila menggunakan fungsi 'typeid.name()' dengan GCC, pengguna mungkin terkejut dengan rentetan pelik yang dipulangkan. Tidak seperti pengkompil lain yang menyediakan nama kelas atau struct yang tidak terkontaminasi, GCC mengeluarkan nama yang dihias penuh dengan potensi kekeliruan.

Menyelesaikan Masalah

Pertimbangkan kod C berikut:

#include <iostream>
#include <typeinfo>

using namespace std;

struct Blah {};

int main() {
  cout << typeid(Blah).name() << endl;
  return 0;
}

Menyusun kod ini dengan GCC 4.4.4 menghasilkan masalah yang membingungkan hasil:

4Blah

Sebaliknya, Visual C 2008 akan kembali:

struct Blah

Menyingkap Misteri

Sebab percanggahan ini terletak pada sifat 'typeid.name()' yang ditentukan oleh pelaksanaan. Pelaksanaan boleh memilih untuk mengembalikan rentetan yang tidak serupa untuk jenis yang berbeza atau bahkan rentetan yang sama untuk jenis yang berbeza.

Nama Berhias GCC

GCC, mengikut reka bentuk, mengembalikan nama yang dihias untuk taip maklumat. Nama yang dihias ini ialah rentetan kompleks yang merangkumi pelbagai butiran tentang jenis itu, termasuk namanya dan hujah templat yang berkaitan.

Menyahkan Nama Berhias

Untuk memahami GCC nama yang dihias, seseorang boleh menggunakan perintah 'c filt' atau fungsi '__cxa_demangle'. Alat ini membolehkan demangling nama yang dihias, mendedahkan kelas asas atau nama struct yang tidak hancur.

Kesimpulan

Sedangkan tingkah laku 'typeid.name()' mungkin berbeza-beza merentasi penyusun, adalah penting untuk mengenali sifat pulangannya yang ditentukan oleh pelaksanaan. Dalam kes GCC, ia mengembalikan nama yang dihias, yang memerlukan alat khusus untuk demangle untuk kebolehbacaan.

Atas ialah kandungan terperinci Mengapakah `typeid.name()` GCC Mengembalikan Nama-nama yang Dicemari Daripada Nama Jenis Biasa?. 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