首页 > 后端开发 > C++ > 正文

为什么 GCC 的 `typeid.name()` 返回损坏的名称而不是普通类型名称?

Mary-Kate Olsen
发布: 2024-11-22 11:50:12
原创
734 人浏览过

Why Does GCC's `typeid.name()` Return Mangled Names Instead of Plain Type Names?

GCC 的损坏类型名称:揭秘 'typeid.name()' 难题

使用 'typeid.name()' 函数时使用 GCC,用户可能会对它返回的特殊字符串感到惊讶。与其他提供未损坏的类或结构名称的编译器不同,GCC 输出一个充满潜在困惑的修饰名称。

深入研究问题

考虑以下 C 代码:

#include <iostream>
#include <typeinfo>

using namespace std;

struct Blah {};

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

使用 GCC 4.4.4 编译此代码会产生令人困惑的结果结果:

4Blah
登录后复制

相比之下,Visual C 2008 将返回:

struct Blah
登录后复制

揭开谜底

造成这种差异的原因在于“typeid.name()”的实现定义性质。实现可能会选择为不同的类型返回不同的字符串,甚至为不同的类型返回相同的字符串。

GCC 的装饰名称

GCC 根据设计返回一个装饰名称类型信息。这个修饰名称是一个复杂的字符串,包含有关该类型的各种详细信息,包括其名称和关联的模板参数。

拆解修饰名称

为了理解 GCC修饰名称,可以使用“c filt”命令或“__cxa_demangle”函数。这些工具可以对修饰名称进行破坏,揭示底层未破坏的类或结构名称。

结论

虽然“typeid.name()”的行为可能有所不同跨编译器,认识到其返回的实现定义的性质至关重要。对于 GCC,它返回修饰名称,这需要专门的工具来分解以提高可读性。

以上是为什么 GCC 的 `typeid.name()` 返回损坏的名称而不是普通类型名称?的详细内容。更多信息请关注PHP中文网其他相关文章!

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