typeid() 返回 g++ 中的额外字符
-
16-09-2019 - |
题
class foo
{
public:
void say_type_name()
{
std::cout << typeid(this).name() << std::endl;
}
};
int main()
{
foo f;;
f.say_type_name();
}
以上代码打印 P3foo 在我的 ubuntu 机器上使用 g++。我不明白为什么要打印 P3foo 而不是仅仅 富. 。如果我改变代码
std::cout << typeid(*this).name() << std::endl;
它打印 3富.
有什么想法吗?
解决方案
由于它是一个指针到foo。和Foo有3个字符。因此,它成为P3foo
。另一种具有类型foo
,因此它成为3foo
。请注意,文字是依赖于实现,在这种情况下GCC只是给你的内部,重整名称。
输入该重整名称为程序c++filt
得到未重整名:
$ c++filt -t P3foo
foo*
其他提示
std::type_info::name()
返回一个实施方式特定的名称。据我所知,没有可移植的方式来获得一个“好”的名字,虽然GCC 有一个。看 abi::__cxa_demangle()
。
int status;
char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status);
std::cout << realname;
free(realname);
有便携式解决方案吗
解决方法是制作一个模板 hack,将所有编码类型名称返回为 char*
哪个平台没有 #include <cxxabi.h>
?
不隶属于 StackOverflow