在 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中文网其他相关文章!