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