根据我的理解,当函数重载时使用名称修改,以便可以区分具有相同名称的函数。
但是我注意到名称修改也与WinMain()
函数一起使用(没有重载)。名称修改后,它变为_WinMain@16
。
那么为什么名称修改与WinMain()
函数一起使用?
这是我使用的代码:
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
return 0;
}
答案 0 :(得分:7)
这不是通常所说的 name mangling 。名称修改用于C ++从同名函数创建可分辨符号名称(不幸的是实现定义)。根据win32 ABI的惯例,你有一个简单的"decorated name"。 Windows使用它们来消除该平台上可用的不同调用约定。
在这种情况下,单@
表示stdcall
调用约定,后面的数字是参数列表中的字节数。 WINAPI
宏扩展为某些特定于编译器的属性,该属性选择stdcall
作为调用约定。
不同的ABI使用不同的名称装饰。例如。在Linux上,您的标准调用约定是cdecl
,它根本不使用任何装饰。但你可以有装饰符号版(巧合地在@
符号之后)