在函数声明中包含调用约定

Including calling conventions in function declarations

我正在阅读有关使用 C/C++ 进行 Win32 编程的文章,发现一个页面将 WinMain 定义为:

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);

大部分我都明白,除了我不明白 WINAPI 部分是从哪里来的?

我知道这是调用约定的宏。这不是我要澄清的。我的问题不是调用约定。

当我查看有关 C++ functions 的 Microsoft 文档并通读函数声明的可选部分时,我没有看到任何提及在函数声明中的任何位置包含调用约定。那么 Microsoft 在其文档中究竟在哪里谈到在函数声明中包含调用约定?

您链接到的 Microsoft 文档部分仅指 C++ 语言的标准组件。调用约定不是 C++ 规范的一部分。

C++ 规范描述了函数如何声明其 return 类型和参数,但并未定义这些值在调用方和被调用方之间实际传递的方式。调用约定规定了,不同的 compilers/platforms 以自己的方式实现调用约定。所以 C++ 规范没有描述调用约定。

在 Microsoft 的文档中,calling conventions are referred to as Microsoft-Specific Modifiers 到 C++ 语言。这在技术上是正确的,因为名称中以 1-2 个下划线开头的 any 标识符是特定于供应商的扩展,并且所有已知的调用约定都以其名称中的下划线开头,例如:

__cdecl
__stdcall
__fastcall
__thiscall
__safecall
__vectorcall
__pascal
__fortran
__syscall
etc...

WINAPISTDMETHODCALL 等宏只是映射到特定的调用约定(通常是 __stdcall,但有时是 __cdecl)。

如果在函数声明中省略,编译器将决定它要使用的调用约定(通常 __cdecl)。

来自不同供应商的编译器不需要实现彼此的扩展。然而,在调用约定的情况下,大多数编译器至少实现 __cdecl__stdcall,并就它们应该如何工作达成一致,以实现代码可移植性。但请不要误会,调用约定仍然是标准语言规范的特定于供应商的扩展。