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