为什么名称修改与WinMain()函数一起使用?

时间:2017-07-06 13:28:19

标签: c winapi name-mangling

根据我的理解,当函数重载时使用名称修改,以便可以区分具有相同名称的函数。

但是我注意到名称修改也与WinMain()函数一起使用(没有重载)。名称修改后,它变为_WinMain@16

那么为什么名称修改与WinMain()函数一起使用?

这是我使用的代码:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{

    return 0;
}

1 个答案:

答案 0 :(得分:7)

这不是通常所说的 name mangling 。名称修改用于C ++从同名函数创建可分辨符号名称(不幸的是实现定义)。根据win32 ABI的惯例,你有一个简单的"decorated name"。 Windows使用它们来消除该平台上可用的不同调用约定。

在这种情况下,单@表示stdcall调用约定,后面的数字是参数列表中的字节数。 WINAPI宏扩展为某些特定于编译器的属性,该属性选择stdcall作为调用约定。

不同的ABI使用不同的名称装饰。例如。在Linux上,您的标准调用约定是cdecl,它根本不使用任何装饰。但你可以有装饰符号版(巧合地在@符号之后)