为何typeid::name返回简化名称而非预期的函数导出名称?
问题原因解析
typeid(&my_amazing_function).name() 返回的 FvdE 和你预期的 _Z19my_amazing_functiond 本质是两种不同的编译器混淆(mangled)名称,对应不同的用途:
FvdE是函数类型的简化混淆名:
你调用typeid时传入的是函数指针,它识别的是void(*)(double)这个函数类型,而非函数实体本身。GCC/Clang对这类类型的简化混淆规则里,F代表函数、v代表void返回值、d代表double参数、E标记类型结束,组合起来就是FvdE。_Z19my_amazing_functiond是函数实体的完整链接符号名:
这是遵循Itanium C++ ABI标准的完整混淆符号,包含了函数名长度(19)、函数名my_amazing_function、参数类型d(double),是链接器用来定位函数实体的名称。
简单说,你用typeid查询的是函数指针的类型信息,得到的是类型的混淆名;而你想要的是函数本身的链接符号名,这两者的生成规则完全不同,所以结果不符。
如果要获取函数的完整链接符号名,不能依赖typeid,可以用这些方式:
- 用
nm等工具查看目标文件的符号表 - 使用GCC内置的
__builtin_FUNCTION__(返回可读函数名,不是混淆后的符号)
内容的提问来源于stack exchange,提问作者user15807286
相关产品推荐
相关产品推荐

