typeid() 返回 g++ 中的额外字符
class foo
{
public:
void say_type_name()
{
std::cout << typeid(this).name() << std::endl;
}
};
int main()
{
foo f;;
f.say_type_name();
}
上面的代码使用 g++ 在我的 ubuntu 机器上打印 P3foo。 我不明白为什么它打印 P3foo 而不是仅仅 foo。 如果我更改代码,就像
std::cout << typeid(*this).name() << std::endl;
打印 3foo 一样。
有什么想法吗?
class foo
{
public:
void say_type_name()
{
std::cout << typeid(this).name() << std::endl;
}
};
int main()
{
foo f;;
f.say_type_name();
}
Above code prints P3foo on my ubuntu machine with g++. I am not getting why it is printing P3foo instead of just foo. If I change the code like
std::cout << typeid(*this).name() << std::endl;
it prints 3foo.
Any thoughts?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
因为它是一个指向 foo 的指针。 foo 有 3 个字符。 所以它变成了
P3foo
。 另一个的类型为foo
,因此它变为3foo
。 请注意,文本与实现相关,在这种情况下,GCC 仅提供内部的、损坏的名称。将损坏的名称输入到程序
c++filt
中以获取未损坏的名称:Because it is a pointer to foo. And foo has 3 characters. So it becomes
P3foo
. The other one has typefoo
, so it becomes3foo
. Note that the text is implementation dependent, and in this case GCC just gives you the internal, mangled name.Enter that mangled name into the program
c++filt
to get the unmangled name:std::type_info::name()
返回一个特定于实现的名称。 AFAIK,尽管 GCC 有一个可移植的方法来获得“好”的名称, 。 看看abi::__cxa_demangle()
。std::type_info::name()
returns an implementation specific name. AFAIK, there is no portable way to get a "nice" name, although GCC has one. Look atabi::__cxa_demangle()
.解决方法是制作一个模板 hack,将所有编码类型名称返回为
char*
,而该平台没有
#include
?workaround would be to make a template hack to return all harcoded type names as
char*
which platform dont have
#include <cxxabi.h>
?