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
ostruct 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.