Perché typeid.name () restituisce caratteri strani usando GCC e come si fa a stampare nomi senza maglie?

Come mai quando main.cpp questo main.cpp :

 #include  #include  using namespace std; struct Blah {}; int main() { cout << typeid(Blah).name() << endl; return 0; } 

Compilandolo con GCC versione 4.4.4:

 g++ main.cpp 

Ho capito:

 4Blah 

Su Visual C ++ 2008, otterrei:

 struct Blah 

C’è un modo per farlo stampare solo Blah o struct Blah ?

    Il ritorno del name è definito dall’implementazione: non è nemmeno richiesta un’implementazione per restituire stringhe diverse per tipi diversi.

    Quello che ottieni da g ++ è un nome decorato , che puoi “demanglare” usando il comando c++filt o __cxa_demangle .

    La stringa restituita è definita dall’implementazione.

    Quello che sta facendo gcc è restituire il nome storpiato.
    È ansible convertire il nome storpiato in testo normale con c ++ filt

     > a.out | c++filt 

    C’è un modo per farlo solo stampare

    Blah o struct Blah ?

    No. Il risultato di std::typeinfo::name() non è specificato. Potrebbe anche restituire la stessa stringa per tutti i tipi (o, in effetti, stringhe vuote per tutti i tipi) e l’implementazione sarebbe ancora conforms agli standard. Non devi fare affidamento sul suo risultato. In realtà, l’unica cosa che ho trovato utile era il debugging.

    Dicci cosa ti serve. Spesso i tratti sono ciò che usi invece.

    Come altri hanno già detto, il risultato qui è definito dall’implementazione , il che significa che l’implementazione (cioè, il compilatore toolchain) è libera di definirlo come vuole, purché lo documenthi da qualche parte.

    Dallo standard C ++, sezione 18.5.1 / 1 [lib.type.info]:

    La class type_info descrive le informazioni sul tipo generate dall’implementazione. Gli oggetti di questa class memorizzano in modo efficace un puntatore a un nome per il tipo e un valore codificato adatto per confrontare due tipi per l’uguaglianza o l’ordine di confronto. I nomi, la regola di codifica e la sequenza di fascicolazione per i tipi sono tutti non specificati e potrebbero differire da un programma all’altro.

    typeid().name() dipende dall’implementazione. Potrebbe persino restituire una stringa vuota per ogni tipo. Non sarebbe un’implementazione molto utile, ma sarebbe valida.

    in 4Blah, 4 è il numero di lettere nel nome della class. Ad esempio se il tuo nome di class è myEmptyClass, allora stamperebbe 12myEmptyClass.