【问题标题】:Including calling conventions in function declarations在函数声明中包含调用约定
【发布时间】:2018-07-11 10:36:23
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我完全不明白这个问题。当然,您可以通过网络搜索找到这些信息。
  • @DavidHeffernan 问题是:如果int是返回类型,wWinMain是函数名,括号里面的东西是参数,那么函数声明中的WINAPI是什么。我以为函数声明只有返回类型、名称和参数。
  • 首先确定WINAPI 宏扩展为什么。然后对其进行网络搜索。

标签: winapi calling-convention winmain


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-07-29
    • 2011-07-12
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 2020-06-16
    • 2012-12-20
    相关资源
    最近更新 更多