【问题标题】:How does winmain 'return two values'? [duplicate]winmain 如何“返回两个值”? [复制]
【发布时间】:2014-03-27 21:10:01
【问题描述】:

我想开始学习windows api,所以看了一些教程,我立刻注意到main函数似乎返回了多个值。

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

这一切意味着什么?不应该是int WinMainWINAPI WinMain,但不能两者兼而有之?

【问题讨论】:

  • @Claudiu 哦,我是新来的,我不知道问题实际上保存了那么久
  • @Claudiu 实际上那些关于那个问题的答案并没有回答我的问题
  • 这只是一个宏。它相当于int __stdcall WinMain(...。它是特定于编译器的扩展,而不是标准。您的问题的答案是它不返回两个值,因为 WINAPI 不是返回值。

标签: c++ winapi


【解决方案1】:

WINAPI 是一个扩展为__stdcall 的宏。它指定调用约定,而不是返回类型。返回类型仍然是'int'

【讨论】:

  • 我仍然对它的位置感到困惑
  • 只要把它当作一个针对Windows平台的非标准C++扩展。只要不完全破坏标准 C++ 语法,微软就可以将它放在他们喜欢的任何地方。
  • @Bathsheba 好的,所以我不必担心那种奇怪的语法:)
  • Bathsheba 关于放置是正确的——这只是编译器约定。我对“愚蠢”略有不同意见。任何函数调用者和被调用者都必须就参数的传递方式达成一致。最通用的方式 -cdecl - 并不总是最快的方式,尤其是在旧的英特尔分段架构上。因此,microsoft API 支持一些更快的替代方案。有关背景信息,请参阅Raymond Chen
【解决方案2】:

为了使 C++ 编译器有效地面向 Windows,对标准 C++ 进行了一些扩展。

其中一个是 WINAPI,在 Win32 中,它被扩展为 __stdcall。这是一个非标准编译器指令,它告诉编译器从左到右传递参数(为了与 VBA 等兼容)。从技术上讲,它被称为调用约定

因此它与返回类型无关,因此您仍然需要编写显式返回类型。

(请注意,在 Win64 中,Microsoft 完全放弃了__stdcall,因此将 WINAPI 定义为空白)。

【讨论】:

  • 比尔盖茨的支持。
  • 我不认为 __stdcall 被定义为空白以外的任何内容...
  • 哦,太骇人听闻你被否决了。开个玩笑,(虽然不是我),我不欣赏表现出如此夸张的偏见的答案。
  • 使用 SDK 8.1,我对 Microsoft 已发布的 API 的尊重要少得多。
猜你喜欢
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2011-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
相关资源
最近更新 更多