在阅读一篇关于函数重载的文章时,作者提到了MSVC进行函数修饰的结果比较gcc更加复杂。
通过查阅GPT发现可以使用vs提供的dumpbin工具查看编译之后的汇编程序相关信息,可以通过下面这条指令进行查看:
dumpbin /all test.exe
在结果中查看@@可以找到修饰后的函数名
具体的格式可以参考官方文档。
可以看到,MSVC不仅记录了函数的参数,同时记录了函数的返回值。
这也是笔者比较疑惑的一点,既然函数重载不需要考虑返回值类型,那么为什么还要记录这个类型呢?(参数相同且函数名相同但返回值类型不同的函数重载不成立,具体可以参考这个问答)
下面结合具体的例子讲解一下函数修饰的格式:
在上述函数中,?开头,a表示函数名,第一个@表示函数名的结束,第二个@表示命名空间的结束,YA表示调用方式为__cdecl,H表示返回值类型为int,D表示参数类型为char。以@Z结束修饰名。详细信息可以参考这篇文章。