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

时间:2018-02-01 07:02:55

标签: winapi calling-convention winmain

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

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

我理解大部分内容,除了我不明白WINAPI部分来自哪里?

我知道这是一个调用约定的宏。这不是我要求的清晰度。我的问题不在于召集公约。

当我查看微软关于C++ functions的文档,并阅读函数声明的可选部分时,我没有看到任何提及在任何地方包含调用约定的内容。功能声明。那么微软在他们的文档中究竟在哪里谈论在函数声明中包含调用约定?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

来自不同供应商的编译器不需要实现彼此的扩展。但是,在调用约定的情况下,大多数编译器至少实现__cdecl__stdcall,并就代码可移植性达成一致意见。但不要搞错,调用约定仍然是标准语言规范的特定于供应商的扩展。