研究typeid奇怪的输出
最近写程序使用到typeid
,其输出在类型名前缀了一些数字或字母,对此不甚清楚,于是一探究竟。Google后发现,typeid
的输出是实现定义的,g++的输出是经过修饰的,为了去掉修饰,我们可以使用c++filt
或 __cxa_demangle
。
以上答案来自how-to-print-demangled-name。
下面以一个具体的例子来进行演示:
#include <iostream>
#include <cxxabi.h>
struct empty {};
template <typename T, int N>
struct bar {};
int main() {
int status;
char* realname;
// typeid
bar<empty, 17> u;
const std::type_info& ti = typeid(u);
realname = abi::__cxa_demangle(ti.name(), 0, 0, &status);
std::cout << ti.name() << "\t=> " << realname << "\t: " << status << '\n';
free(realname);
return 0;
}
上述代码片段的输出为:
3barI5emptyLi17EE => bar<empty, 17> : 0
可以看到,如果不进行去装饰(demangle),我们得到的输出就是3barI5emptyLi17EE
,去装饰后我们得到跟源代码中一致的类型输出。