c++ gcc g++ rtti

c++ - ¿Por qué typeid.name() devuelve caracteres extraños usando GCC y cómo hacer que imprima nombres no marcados?



g++ rtti (6)

¿Cómo es que cuando ejecuto este main.cpp :

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

Compilando con la versión 4.4.4 de GCC:

g++ main.cpp

Entiendo esto:

4Blah

En Visual C ++ 2008, obtendría:

struct Blah

¿Hay alguna manera de hacer que solo imprima Blah o struct Blah ?


¿Hay alguna manera de hacerlo solo imprimir

Blah o struct Blah ?

No. El resultado de std::typeinfo::name() no está especificado. Incluso podría devolver la misma cadena para todos los tipos (o, de hecho, cadenas vacías para todos los tipos) y la implementación seguiría siendo conforme a las normas. No debes confiar en su resultado. Realmente, lo único que encontré útil fue la depuración.

Díganos para qué lo necesita. A menudo, los rasgos son los que usa en su lugar.


Como han dicho otros, el resultado aquí está definido por la implementación , lo que significa que la implementación (es decir, la cadena de herramientas del compilador) es libre de definir cómo quiere, siempre que lo documente en alguna parte.

Del estándar de C ++, sección 18.5.1 / 1 [lib.type.info]:

La clase type_info describe la información de tipo generada por la implementación. Los objetos de esta clase almacenan efectivamente un puntero a un nombre para el tipo, y un valor codificado adecuado para comparar dos tipos de igualdad o orden de clasificación. Los nombres, la regla de codificación y la secuencia de clasificación para los tipos no están especificados y pueden diferir entre los programas.


El retorno del name está definido en la implementación: ni siquiera se requiere una implementación para devolver cadenas diferentes para diferentes tipos.

Lo que obtienes de g ++ es un nombre decorado , que puedes "exigir" usando el comando c++filt o __cxa_demangle .


La cadena devuelta es implementación definida.

Lo que está haciendo gcc es devolver el nombre destrozado.
Puede convertir el nombre destrozado en texto sin formato con c ++ filt

> a.out | c++filt


en 4Blah, 4 es el número de letras en su nombre de clase. Por ejemplo, si su nombre de clase es myEmptyClass, imprimiría 12myEmptyClass.


typeid().name() depende de la implementación. Incluso puede devolver cadena vacía para cada tipo. Esa no sería una implementación muy útil, pero sería válida.