c++ g++ name-mangling typeid

c++ - typeid() devuelve caracteres extra en g++



name-mangling (3)

class foo { public: void say_type_name() { std::cout << typeid(this).name() << std::endl; } }; int main() { foo f;; f.say_type_name(); }

El código anterior imprime P3foo en mi máquina ubuntu con g ++. No entiendo por qué está imprimiendo P3foo en lugar de solo foo . Si cambio el código como

std::cout << typeid(*this).name() << std::endl;

imprime 3foo .

¿Alguna idea?


¿Hay una solución portátil?

la solución sería hacer un truco de plantilla para devolver todos los nombres de tipo codificados como char*

¿ #include <cxxabi.h> plataforma no tiene #include <cxxabi.h> ?


Porque es un puntero a foo. Y foo tiene 3 personajes. Así se convierte en P3foo . El otro tiene tipo foo , por lo que se convierte en 3foo . Tenga en cuenta que el texto depende de la implementación, y en este caso, GCC solo le da el nombre interno y mutilado.

Ingrese ese nombre mutilado en el programa c++filt para obtener el nombre no enredado:

$ c++filt -t P3foo foo*


std::type_info::name() devuelve un nombre específico de implementación. AFAIK, no hay una forma portátil de obtener un nombre "bonito", aunque GCC tiene uno . Mira abi::__cxa_demangle() .

int status; char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status); std::cout << realname; free(realname);