首页 > 后端开发 > C++ > 为什么 GCC 的 `typeid.name()` 返回奇怪的类型名称,如何修复它?

为什么 GCC 的 `typeid.name()` 返回奇怪的类型名称,如何修复它?

DDD
发布: 2024-11-30 14:59:11
原创
444 人浏览过

Why Does GCC's `typeid.name()` Return Weird Type Names, and How Can I Fix It?

使用 typeid.name() 揭秘 GCC 奇怪的类型名称输出

在 C 中处理类型信息时,typeid.name() 是一个方便的工具来获取类型的名称。然而,使用 GCC 时,开发人员在其输出中遇到了令人困惑的字符。本文深入探讨了这种行为背后的原因,并探讨了如何获取未损坏的类型名称。

装饰名称之谜

默认情况下,GCC 返回类型的“装饰名称”,其中包括附加信息,并且不可读。提供的代码片段对此进行了举例说明:

#include <iostream>
#include <typeinfo>

struct Blah {};

int main() {
  cout << typeid(Blah).name() << endl;
  return 0;
}
登录后复制

使用 GCC 编译时,代码输出“4Blah”而不是预期的“Blah”。这是因为 GCC 在名称中附加了与类型相关的信息,例如参数和大小。

拆解修饰名称

要获得未拆解的名称,我们需要应用一个称为“拆解”的过程”。 GCC 为此提供了 __cxa_demangle() 函数,以及命令行工具 c filt。

以下代码演示了如何对修饰名称进行 demangle:

#include <iostream>
#include <typeinfo>

int main() {
  const char* decorated_name = typeid(Blah).name();
  char* unmangled_name = abi::__cxa_demangle(decorated_name, nullptr, nullptr, nullptr); // Windows: _ZNKSt7__cxxabiv117__class_type_info9can_catchEPv
  if (unmangled_name) {
    cout << unmangled_name << endl;
    free(unmangled_name);
  } else {
    cout << "Demangling failed" << endl;
  }  
  return 0;
}
登录后复制

编译时使用 GCC,此代码现在将输出“Blah”,如下所示

结论

虽然 typeid.name() 是在 C 中获取类型信息的一个有价值的工具,但了解 GCC 如何处理类型名称至关重要。通过利用上述的分解技术,开发人员可以提取人类可读的类型名称,从而简化调试和分析。

以上是为什么 GCC 的 `typeid.name()` 返回奇怪的类型名称,如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板