typeid () gibt zusätzliche Zeichen in g ++
-
16-09-2019 - |
Frage
class foo
{
public:
void say_type_name()
{
std::cout << typeid(this).name() << std::endl;
}
};
int main()
{
foo f;;
f.say_type_name();
}
Über Code druckt P3foo auf meinem Ubuntu-Rechner mit g ++. Ich erhalte nicht, warum es druckt P3foo statt nur foo . Wenn ich den Code wie
ändern std::cout << typeid(*this).name() << std::endl;
druckt 3foo .
Alle Gedanken?
Lösung
Weil es ein Zeiger auf foo ist. Und foo hat 3 Zeichen. So wird es P3foo
. Der andere hat foo
geben, so wird es 3foo
. Beachten Sie, dass der Text ist die Umsetzung abhängig, und in diesem Fall GCC gibt Ihnen nur die internen, verstümmelten Namen.
Geben Sie diesen verstümmelten Namen in das Programm c++filt
den unmangled Namen zu bekommen:
$ c++filt -t P3foo
foo*
Andere Tipps
std::type_info::name()
gibt eine Implementierung bestimmten Namen. AFAIK gibt es keine portable Möglichkeit, einen „schönen“ Namen zu erhalten, obwohl GCC man hat . Schauen Sie sich abi::__cxa_demangle()
.
int status;
char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status);
std::cout << realname;
free(realname);
Gibt es eine portable Lösung
Abhilfe wäre eine Vorlage zu machen hacken alle harcoded Typnamen als char*
zurückzukehren
, welche Plattform #include <cxxabi.h>
nicht haben?