Mittwoch, 25. März 2009

C++: ABI zur Laufzeit entwirren

Die C++ typeinfo ist ja immer so eine Sache. Einige Compiler entwirren die Namen, andere wieder nicht. G++ gehört zu den Compilern die das nicht von sich aus machen, aber man kann sich leicht Abhilfe schaffen.

#include <typeinfo>
#include <iostream>
#include <cxxabi.h>

#define HAVE_CXA_DEMANGLE

#ifdef HAVE_CXA_DEMANGLE
const char* demangle(const char* name)
{
char buf[1024];
unsigned int size = 1024;
int status;
char* res;
res = abi::__cxa_demangle(name,
buf,
&size,
&status);
return res;
}
#else
const char* demangle(const char* name)
{
return name;
}
#endif

int main()
{
std::cout << typeid(std::cout).name();
std::cout << std::endl;
std::cout << ::demangle(typeid(std::cout).name());
std::cout << std::endl;
return 0;
}

/* Ausgabe :
[raichoo@sparkster:~]> ./a.out
So
std::ostream
*/