0

我正在阅读有关使用 C/C++ 进行 Win32 编程的信息,并遇到一个将 WinMain 定义为的页面:

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

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

我知道这是一个调用约定的宏。这不是我想要澄清的。我的问题不在于调用约定。

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

4

1 回答 1

2

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

C++ 规范描述了函数如何声明其返回类型和参数,但没有定义这些值如何在调用者和被调用者之间实际传递。调用约定规定了这一点,不同的编译器/平台以自己的方式实现调用约定。所以 C++ 规范没有描述调用约定。

在 Microsoft 的文档中,调用约定称为C++ 语言的Microsoft 特定修饰符。这在技术上是正确的,因为名称中以 1-2 下划线开头的任何标识符都是特定于供应商的扩展,并且所有已知的调用约定都以名称中的下划线开头,例如:

__cdecl
__stdcall
__fastcall
__thiscall
__safecall
__vectorcall
__帕斯卡
__fortran
__系统调用
ETC...

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

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

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

于 2018-02-03T00:20:52.290 回答