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

为什么 GCC 的 `typeid.name()` 返回不可读的名称,如何修复它?

Susan Sarandon
发布: 2024-12-05 05:22:14
原创
119 人浏览过

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

GCC 的 typeid.name() 特性

typeid.name() 函数通常用于获取有关变量类型的信息或表达。然而,当使用 GCC 编译时,我们发现该函数返回看似无意义的字符,而不是预期的未损坏的类型名称。此行为与 Visual C 等其他编译器形成鲜明对比,后者提供了更清晰的表示。

差异背后的原因

差异在于 typeid 的实现。 name(),由编译器的实现定义。例如,GCC 返回一个装饰名称,其中包括有关类型的附加信息,例如构造函数和析构函数的名称和签名。

拆解装饰名称

要从修饰字符串中获取更具可读性的类型名称,可以使用 c filt 或 __cxa_demangle 等工具。这些工具“分解”修饰名称,删除额外的信息并留下未分解的类型名称。

示例:使用 c filt 分解

#include <iostream>
#include <typeinfo>

using namespace std;

struct Blah {};

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

何时你编译并执行这个修改后的代码,你将得到想要的输出:

struct Blah
登录后复制

结论

虽然GCC的typeid.name()函数最初返回一个修饰的类型名称,但可以对其进行分解以获得未修饰的类型使用 c filt 或 __cxa_demangle 等工具命名。通过了解 typeid.name() 的实现定义性质,您可以有效地在 C 代码中检索所需的类型信息。

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

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