typeid() 返回 g++ 中的额外字符

发布于 2024-07-17 13:14:30 字数 439 浏览 5 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

风吹雨成花 2024-07-24 13:14:30

因为它是一个指向 foo 的指针。 foo 有 3 个字符。 所以它变成了P3foo。 另一个的类型为 foo,因此它变为 3foo。 请注意,文本与实现相关,在这种情况下,GCC 仅提供内部的、损坏的名称。

将损坏的名称输入到程序 c++filt 中以获取未损坏的名称:

$ c++filt -t P3foo
foo*

Because it is a pointer to foo. And foo has 3 characters. So it becomes P3foo. The other one has type foo, so it becomes 3foo. 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:

$ c++filt -t P3foo
foo*
烟燃烟灭 2024-07-24 13:14:30

std::type_info::name() 返回一个特定于实现的名称。 AFAIK,尽管 GCC 有一个可移植的方法来获得“好”的名称, 。 看看 abi::__cxa_demangle()

int status;
char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status);
std::cout << realname;
free(realname);

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 at abi::__cxa_demangle().

int status;
char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status);
std::cout << realname;
free(realname);
若无相欠,怎会相见 2024-07-24 13:14:30

是否有便携式解决方案

解决方法是制作一个模板 hack,将所有编码类型名称返回为 char*,而

该平台没有 #include

Is there a portable solution

workaround would be to make a template hack to return all harcoded type names as char*

which platform dont have #include <cxxabi.h>?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文